我目前正在开发一个网站,其中某些动态数据必须以各种语言提供。现在的语言有三种,但想法是在未来增加更多。
想象一下这第一个场景,你有一个页面,并希望以三种不同的语言提供内容。我的数据库中的页面存储如下:
这很有用,因为对于我所拥有的每种语言,我都会为这些页面创建一个新的翻译内容。
但是,随着项目的进展,我发现了更多需要翻译数据的情况。下图是具有类型,子类型和状态的产品的示例。所有这些数据必须以所有不同的语言提供。
这不是有点矫枉过正,因为我最终会拿着只持有ID的表格吗?对于需要保存翻译内容的每个表格,我需要一个新表格。
有没有更好的方法?
答案 0 :(得分:2)
如果你愿意牺牲一些外键和“数据库纯度”,你可以这样做:
CREATE TABLE LocalizedTexts(OwnerType byte PK, OwnerID int PK, LanguageID int PK, Text string)
对于每个“所有者”(Products,StatusNames,Types,...),您可以指定一个整数常量OwnerType
。在LocalizedTexts
中,您的主键包含所有者类型,所有者ID(例如ProductID
或StatusNameID
或TypeID
,...)和语言ID。< / p>
如果OwnerType
不唯一(因为它来自多个表),则
OwnerID
消除歧义。
这是一个很好的可扩展和规范化的架构。唯一的缺点是你不能在这里拥有FK。
答案 1 :(得分:1)
我认为这取决于您是否需要对新语言采用“动态”方法,或者您基本上知道应用需要支持多少种语言。
我们只有每种语言的专栏:
Create table Product (int id, text name_de, text name_en, etc... )
但这意味着,如果添加新语言,则必须稍微更改数据库架构。 但是编程简单,查找速度快。
此解决方案与@ usr之间的区别在于,在他的解决方案中,您可以在不更改数据库的情况下添加语言。每次添加新语言时,我的解决方案都需要架构更新。例如。瑞士的大多数公司都有他们的网站3种,也许是4种语言,他们就是这样。所以,这个解决方案有效。但如果你不断添加语言,那就有点复杂了。