Java “定义”的最佳实践设计模式;“类型”;在具有潜在多语言需求的数据库中?

Java “定义”的最佳实践设计模式;“类型”;在具有潜在多语言需求的数据库中?,java,design-patterns,database-design,types,Java,Design Patterns,Database Design,Types,我更具体的问题是: 我希望多个前端的用户能够看到数据库行的“类型”。让我们简单地说,我有一个person表,类型可以是Student,Teacher,Parent等等 具体的程序将是带有hibernate的java,但是我怀疑这对于这个问题来说很重要,但是假设我的数据是在实体bean中建模的,Person“type”字段是一个包含我的3个选项的枚举,理想情况下我希望我的Person对象有一个getType()方法,我的前端可以使用它来显示类型,我还需要一种方法让我的前端知道潜在的类型 使用enu

我更具体的问题是:

我希望多个前端的用户能够看到数据库行的“类型”。让我们简单地说,我有一个person表,类型可以是
Student
Teacher
Parent
等等

具体的程序将是带有hibernate的java,但是我怀疑这对于这个问题来说很重要,但是假设我的数据是在实体bean中建模的,Person“type”字段是一个包含我的3个选项的枚举,理想情况下我希望我的Person对象有一个
getType()
方法,我的前端可以使用它来显示类型,我还需要一种方法让我的前端知道潜在的类型

使用enum方法,我有这个功能,但我没有的是在不重新编译的情况下轻松添加新类型的能力

所以下一个想法是,我把我的类型放在一个配置文件中,然后简单地在数据库中以字符串的形式描述它们。我的
getType()
方法可以工作,但是现在我的前端必须加载一个配置文件来获取潜在的类型,现在没有任何东西可以保持它们的同步,我可以从配置文件中删除一个类型,数据库中的类型将不会指向任何内容。我也不喜欢这个

最后一个想法是创建一个PersonTypes数据库表,该表有一个用于
type\u id
的数字和一个定义类型的
string
。这没关系,如果设置了外键,我就不能删除我正在使用的类型,我的前端将需要看到潜在的类型,我想最好的方法是提供一个使用hibernate层来完成这项工作的服务

这个方法的问题是,我的类型在数据库中都是英文的,我希望我的应用程序支持多种语言(最终),所以我需要某种属性文件来存储类型的标签。那么,我是否有一个
PersonType
表,该表纯粹包含整数,然后是一个描述每个整数的标签的属性文件?这似乎是倒退

是否有一个共同的设计模式来实现这种行为?或者有人能提出一个好的方法吗

问候,


Glen x

我将采用您描述的最后一种方法。将类型信息放在单独的表中应该足够好,它将允许您使用SQL的所有优点来管理其他约束(类型可能是唯一的,外键检查将确保您在删除某些记录时不会引入任何错误行为)

当每种类型都在属性文件中定义了
i18n
值时,您就安全了。如果类型已删除-将不使用此值。如果需要,可以在运行时更改属性文件

我能想到的最后一种方法是将
i18n
字符串与类型信息一起存储在
PersonType
中。这对于少量的语言来说是可以接受的,尽管可能是一种反模式。但它会让你有这样的方法:

public String getName(PersonType type, Locale loc) {
  if (loc.equals(Locale.EN)) {
   return type.getEnglishName();
  } else if (loc.equals(Locale.DE)){
   return type.getGermanName();
  } else {
    return type.getDefaultName();
  }
}

您可以使用以下做法:

  • 使用单例设计模式
  • 对现金类型的人员使用现金框架,如EhCashe,并在需要时重新加载

  • 将动态价值国际化总是很困难的。最后一种存储类型的方法是正确的

    如果您希望能够i18n它们,您可以将资源束用作应用程序中的属性文件。这将迫使您修改属性文件,并在每次添加新类型时重新部署和重新启动应用程序。如果在资源包中找不到该类型,您也可以返回到数据库中存储的英文字符串


    或者,您可以实现一个自定义ResourceBundle类,该类直接从数据库获取其键和值,并具有一个额外的PersonTypeI18n表,其中包含您想要支持的所有区域设置的翻译。

    我想我的第一个主要问题是,我实际上不知道i18n是什么。我想这正是我出错的地方。i18n的意思是“国际化”。这是一个标准的缩写,因为这个词在起始I和结束N之间有18个字符。所以这个想法是,类型表有一个type_id和一个i18n值,这是一个任意值,是指向属性文件中定义的指针?我会用另一种方法来做:如果类型表包含id“foo”和“bar”,我将有一个属性文件,其中包含类似“foo=…”和“bar=…”的内容。属性文件使用数据库中的ID。这将使我的类型表具有单个列?