什么是多语言数据库设计的最佳实践?

Ars*_*yan 183 sql database database-design

创建多语言数据库的最佳方法是什么?为每个表创建本地化表使设计和查询变得复杂,在其他情况下为每种语言添加列很简单但不动态,请帮助我理解什么是企业应用程序的最佳选择

M4N*_*M4N 205

我们所做的是为每个多语言对象创建两个表.

例如,第一个表仅包含与语言无关的数据(主键等),第二个表包含每种语言一个记录,包含本地化数据和语言的ISO代码.

在某些情况下,我们添加一个DefaultLanguage字段,这样如果没有可用于指定语言的本地化数据,我们就可以回退到该语言.

例:

Table "Product":
----------------
ID                 : int
<any other language-neutral fields>


Table "ProductTranslations"
---------------------------
ID                 : int      (foreign key referencing the Product)
Language           : varchar  (e.g. "en-US", "de-CH")
IsDefault          : bit
ProductDescription : nvarchar
<any other localized data>
Run Code Online (Sandbox Code Playgroud)

使用此方法,您可以根据需要处理多种语言(无需为每种新语言添加其他字段).


更新(2014-12-14):请查看此答案,了解有关用于将多语言数据加载到应用程序的实现的一些其他信息.

  • 如果唯一的语言中立字段是id呢?以及插入行时如何插入外键引用? (13认同)
  • 有趣的是,我正在设计一个多语言CMS的数据库方案,并且在我脑海中也有这个问题.在我看到这个答案之前,我选择了这种方法!谢谢你的回答! (4认同)
  • 这里需要注意的一点是,这个表上没有PK,或者ID和语言需要是复合PK.要么是这样,要么你需要添加一个ProductTranslationId字段,可能是一个标识. (4认同)

Ren*_*soo 17

我推荐Martin发布的答案.

但您似乎担心您的查询过于复杂:

为每个表创建本地化表正在使设计和查询变得复杂......

所以你可能会想,而不是像这样编写简单的查询:

SELECT price, name, description FROM Products WHERE price < 100
Run Code Online (Sandbox Code Playgroud)

...你需要开始编写这样的查询:

SELECT
  p.price, pt.name, pt.description
FROM
  Products p JOIN ProductTranslations pt
  ON (p.id = pt.id AND pt.lang = "en")
WHERE
  price < 100
Run Code Online (Sandbox Code Playgroud)

不是很漂亮的观点.

但是,不应手动执行,而应开发自己的数据库访问类,预先解析包含特殊本地化标记的SQL,并将其转换为需要发送到数据库的实际SQL.

使用该系统可能看起来像这样:

db.setLocale("en");
db.query("SELECT p.price, _(p.name), _(p.description)
          FROM _(Products p) WHERE price < 100");
Run Code Online (Sandbox Code Playgroud)

而且我相信你能做得更好.

关键是要以统一的方式命名您的表和字段.


Nic*_*ick 14

我觉得这种方法适合我:

Product     ProductDetail        Country
=========   ==================   =========
ProductId   ProductDetailId      CountryId
- etc -     ProductId            CountryName
            CountryId            Language
            ProductName          - etc -
            ProductDescription
            - etc -

ProductDetail表包含您要支持的语言的所有翻译(对于产品名称,描述等).根据您应用的要求,您可能希望将Country表分解为使用区域语言.

  • 国家和语言(语言环境)是不同的东西.ISO语言代码是自然键,您可以消除从lang到country的不必要的连接. (7认同)

omo*_*oto 10

我正在使用下一个方法:

产品

ProductID OrderID,...

ProductInfo

ProductID标题名称LanguageID

语言

LanguageID名称文化,....