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

创build多语言数据库的最佳方法是什么? 为每个表创build本地化表正在进行复杂的devise和查询,在其他情况下,为每种语言添加列是简单的但不是dynamic的,请帮助我了解什么是企业应用程序的最佳select

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

例如,第一个表只包含与语言无关的数据(主键等),第二个表包含每种语言的一个logging,其中包含本地化数据和该语言的ISO代码。

在某些情况下,我们添加一个DefaultLanguage字段,以便在没有可用于指定语言的本地化数据的情况下,我们可以使用该语言。

例:

Table "Product": ---------------- ID : int <any other language-neutral fields> Table "ProductTranslations" --------------------------- ID : int (foreign key referencing the Product) Language : varchar (eg "en-US", "de-CH") IsDefault : bit ProductDescription : nvarchar <any other localized data> 

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


更新(2014-12-14):请看看这个答案 ,关于用于将多语言数据加载到应用程序中的实现的一些附加信息。

我发现这种方法适用于我:

产品ProductDetail国家
 ========= ================== =========
 ProductId ProductDetailId CountryId
 -  etc  -  ProductId CountryName
            国家语言
             ProductName  - 等 - 
            产品描述
             - 等 - 

ProductDetail表包含所有需要支持的语言的翻译(产品名称,描述等)。 根据您的应用程序的要求,您可能希望打破“国家/地区”表格以使用区域语言。

我推荐Martin发布的答案。

但是你似乎担心你的查询太复杂了:

为每个表创build本地化的表正在devise和查询复杂…

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

 SELECT price, name, description FROM Products WHERE price < 100 

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

 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 

不是一个非常漂亮的视angular。

但是不要手动完成它,你应该开发自己的数据库访问类,它预先parsing包含特殊本地化标记的SQL,并将其转换为实际需要发送到数据库的SQL。

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

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

我相信你可以做得更好。

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

我正在使用下一个方法:

产品

ProductID订单ID,…

ProductInfo

ProductID标题名称LanguageID

语言

LanguageID名称文化,….

Martin的解决scheme与我的解决scheme非常相似,但如果找不到所需的翻译,您将如何处理默认说明?

这将需要每个字段的IFNULL()和另一个SELECT语句吗?

默认翻译将被存储在同一个表中,其中诸如“isDefault”之类的标志表示在当前语言没有被发现的情况下该描述是默认描述。