【发布时间】:2015-06-21 08:24:56
【问题描述】:
如果我们要开发多语言应用程序,我们应该将翻译存储在资源文件还是数据库?
假设我们选择在数据库中进行。 关系模型中是否有标准的多语言实体建模方法?
1。一张大翻译表
我们可以将所有翻译存储在一个表中,并使用语言中性键作为属性值。
人员(SSN、名字、姓氏、生日)
翻译(key、langid、翻译)
2。每个实体一个翻译表
人(SSN、生日)
PersonML(SSN、LangId、FirstName、LastName)
我更喜欢这种方法。真的是1:N的关系。
问题
似乎不能使用多语言列来形成主键。
假设每个人都有一个唯一的名字,那么 (FirstName, LastName) 可以用作主键。
人物(FirstName、LastName、生日)
但是,在考虑多语言时,(FirstName, LastName) 无法识别一个人。
显然我们不能添加 LangId 来形成主键。
人员(LangId、FirstName、LastName、生日)
在这种情况下,一个人将被存储在多行中,并且非关键列将被复制。
我们是否必须为主键使用语言中立的列?
当没有这样的列时,我们应该使用代理吗?
我被告知不应盲目使用代理,我非常同意。
更新 1
在示例中,我假设 FirstName 和 LastName 需要本地化。
如果每个实体总是有一些属性,如 SSN,则第二种方法更有意义。
但是,如果某些有效的主键包含需要本地化的列,则它们可能会变得无效。
另一个例子
每个公司都有一个唯一的名称,因此 CompanyName 可以用作主键。
公司(公司名称,...)
在本地化方面,公司名称不能用作主键。我们必须发明一些代码来代表公司。
这是否意味着本地化不适合关系模型?
更新 2
3。默认语言与其他语言的1:N关系
用户可能会将公司表视为:
公司(CompanyNameEnglish、CompanyNameFrench、CompanyNameSpanish,...)
当然有重复组,所以它打破了1NF。
改进:
公司(CompanyNameEnglish,...)
CompanyNameML(CompanyNameEnglish、LangId、CompanyName)
问题是我们必须提供默认(英文)名称,即使用户不需要它。
一些用户可能会提供英文名称,而其他用户可能只提供法文名称。
这个要求是不是太做作了?
4。 DBMS 本地化支持
PerformanceDBA 在他的评论中提到了这一点。
我会做更多的研究。
【问题讨论】:
-
从您的示例中完全不清楚您的数据模型中的 什么 需要翻译。相反,它看起来更像是“什么是好的主键”之类的问题。请使用关于您的数据模型和需要本地化的列的具体信息编辑您的帖子。
-
假设 SSN 代表社会安全号码(并且应该是唯一的),它似乎是主键的自然选择。在翻译表中只需添加语言标识符即可创建主键。
-
(a) 如果您想要一个无法发明代码的 RDB,则密钥必须由数据组成 (b) 本地化与 RM 无关,这是一个实现问题。获得一个 SQL 平台,现在本地化是标准的 (c) 如果您有本地化“问题”,那是因为您没有 [i] 商业服务器。无论您为 NONsql 编写的任何代码都将是不可移植的,当您获得 [i] 时,您必须替换它 (d) 将所有内容存储在数据库中 (e) 我不确定您是否真的理解我的答案,您还在问如何打破规则。
-
(e) LangId 是 Person 的一个属性,不一定是 Relational 键的一部分,它与 Person PK 是 1::1。现在,如果您确实没有拥有真正的 SQL 平台,当然,您可能必须在每个代码段中处理本地化,然后在整个过程中携带 LangId,当然,您可以在 PK 的一部分中进行,但如果 (SSN) 或 (LastName,FirstName) 是唯一的,则 (f) 是不正确的,那么加上 anything 也是唯一的。添加是多余的。
标签: database-design relational-database multilingual