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

时间:2012-02-09 12:22:59

标签: java design-patterns database-design types

我的问题更具特异性:

我希望多个前端的用户看到数据库行的“类型”。让我们轻松说我有一个人员表,类型可以是StudentTeacherParent等。

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

使用enum方法我有这个功能,但我没有的是能够轻松添加新类型而无需重新编译。

所以接下来的想法是我将我的类型放入配置文件中,并简单地将它们作为字符串在数据库中故事。我的getType()方法有效,但现在我的前端必须加载一个配置文件来获取潜在的类型和现在没有什么可以保持它们同步,我可以从我的配置文件和数据库中的类型中删除一个类型什么都不会。我也不喜欢这样。

最后的想法是我创建了一个PersonTypes数据库表,该表有一个type_id的数字和一个定义该类型的string。这没关系,如果设置了外键我无法删除我正在使用的类型,我的前端需要看到潜在的类型,我想最好的方法是提供一个将使用的服务hibernate层来做这件事。

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

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

此致

Glen x

3 个答案:

答案 0 :(得分:0)

我会选择你描述的最后一种方法。将类型信息放在单独的表中应该是很好的,并且它将允许您使用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();
  }
}

答案 1 :(得分:0)

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

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

或者您可以实现一个自定义的ResourceBundle类,它直接从数据库中获取其键和值,并有一个额外的PersonTypeI18n表,其中包含您要支持的所有语言环境的翻译。

答案 2 :(得分:-1)

您可以使用以下做法:

  1. 使用单件设计模式
  2. 使用兑现框架,例如 EhCashe 作为cashe类型的人,并在需要时重新加载。