数据库表中的多语言字段

时间:2009-06-01 21:41:03

标签: java mysql hibernate database-design internationalization

我的应用程序需要支持多语言界面,确切地说是五种语言。对于接口的主要部分,可以使用标准ResourceBundle方法来处理此问题。

但是,该数据库包含许多表,其元素包含人类可读的名称,描述,摘要等。需要能够以所有五种语言输入其中的每一种。

虽然我想我可以简单地在每个表上都有字段,如

NameLang1
NameLang2
...

我认为在编写代表每个表的bean时会导致大量相同的代码。

从纯粹面向对象的角度来看,解决方案很简单。每个类只有一个Text对象,其中包含每种语言中的相关文本。这进一步有用,因为只有一种语言是强制性的,其他语言具有后备规则(例如,如果语言4缺少返回语言2,它返回到必须的语言1)。

不幸的是,将其映射回关系数据库,意味着我最终得到了一个表,其中有10-12个其他表FK(实际上有些表有多个FK)。

这种方法似乎有效,我已经能够使用Hibernate将数据映射到POJO。关于你唯一不能做的就是从Text对象映射到它的父对象(因为你无法知道你应该链接到哪个表),但几乎没有必要这样做。

所以,总的来说这似乎有效,但让多个表像这样引用一个表只是感觉不对。有人有更好的主意吗?

如果重要我正在使用MySQL ......

5 个答案:

答案 0 :(得分:2)

我必须这样做...一些表的多语言文本...我不知道我是否找到了最佳解决方案,但我所做的是使用与语言无关的信息表然后是子表与所有多语种领域。对于默认语言,子表中至少需要一条记录;以后可以添加更多语言。

在Hibernate上,您可以将子表中的信息映射为Map,并获取所需语言的信息,如您所说,在POJO上实现回退。您可以为多语言字段使用不同的getter,在内部调用fallback方法以获取所需语言的适当子对象,然后返回所需的字段。

这种方法使用了更多的表(每个需要多语言信息的表都有一个额外的表),但性能要好得多,以及我认为的维护......

答案 1 :(得分:2)

例如,在gettext中使用的标准翻译方法是使用单个字符串来描述概念并调用转换为目标语言的translate方法。

这样你只需要在数据库中存储一个字符串(规范表示),然后在你的应用程序中调用translate方法来获取翻译后的字符串。没有FK和总灵活性,只需要一点运行时性能(可能还有一些维护问题,但有些人认为在这种情况下不需要让维护成为问题)。

答案 2 :(得分:0)

我在具有类似问题的应用程序中看到的方法是我们使用“text id”列来存储引用,并且我们有一个包含所有翻译的表。这在重用相同的密钥以减少所需的翻译量方面也提供了一些灵活性,这是项目的一个昂贵的部分。

它还提供了数据和翻译之间的良好分离,在我看来,这些翻译更像是UI。

如果您需要的字符串毕竟不是那么多,那么您可以将它们全部加载到内存中一次并使用某种方法通过检查内存中的数据结构来提供翻译。

使用这种方法,你的bean不会有每种语言的getter,但你会使用其他一些翻译器对象:

 MyTranslator.translate(myBean.getNameTextId());

答案 3 :(得分:0)

根据您的要求,最好为每个需要多语言的表格提供单独的标签表。例如:您有一个带有xyz_id列的XYZ表,以及带有xyz_id,language_code,label,other_label等的XYZ_Label表

与单个巨大的标签表相比,优势在于您可以对XYZ_labels表执行唯一约束(例如:XYZ的英文名称必须是唯一的),并且您可以更有效地执行索引查找,因为索引一次只会覆盖一个表(例如:如果你需要按英文名称查找XYZ实体)。

答案 4 :(得分:0)

这是怎么回事: http://rob.purplerockscissors.com/2009/07/24/internationalizing-websites/ ......这就是用户“Chochos”在回应#2中所说的内容