【发布时间】:2010-10-30 02:06:39
【问题描述】:
创建多语言数据库的最佳方法是什么?为每个表创建本地化表使设计和查询变得复杂,在其他情况下为每种语言添加列很简单但不是动态的,请帮助我了解企业应用程序的最佳选择是什么
【问题讨论】:
-
我发现这对我很有帮助:Multilanguage Database Design in MySQL
标签: sql database database-design
创建多语言数据库的最佳方法是什么?为每个表创建本地化表使设计和查询变得复杂,在其他情况下为每种语言添加列很简单但不是动态的,请帮助我了解企业应用程序的最佳选择是什么
【问题讨论】:
标签: sql database database-design
我们所做的是为每个多语言对象创建两个表。
例如第一个表仅包含与语言无关的数据(主键等),第二个表包含每种语言的一条记录,包含本地化数据和该语言的 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>
通过这种方法,您可以根据需要处理尽可能多的语言(无需为每种新语言添加额外的字段)。
更新 (2014-12-14):请查看 this answer,了解有关用于将多语言数据加载到应用程序中的实现的更多信息。
【讨论】:
id :D 的单列。解释一下,每个id 代表一个含义,您可以在关系表中附加来自任何语言的单词,因此您会得到两个表,meaning (id) 和 word (id,meaning_id),id word表中的id代表单词id,meaning中的meaning代表通用的意思。
我推荐 Martin 发布的答案。
但您似乎担心您的查询过于复杂:
为每个表创建本地化表使设计和查询变得复杂......
所以你可能会想,与其编写这样的简单查询:
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
不是一个非常漂亮的观点。
但是,您应该开发自己的数据库访问类,而不是手动执行此操作,该类会预先解析包含您的特殊本地化标记的 SQL,并将其转换为您需要发送到数据库的实际 SQL。
使用该系统可能看起来像这样:
db.setLocale("en");
db.query("SELECT p.price, _(p.name), _(p.description)
FROM _(Products p) WHERE price < 100");
我相信你可以做得更好。
关键是让您的表和字段以统一的方式命名。
【讨论】:
我发现这种方法适合我:
产品 产品详情 国家 ===================================== ProductId ProductDetailId CountryId - 等等 - ProductId CountryName CountryId 语言 产品名称 - 等等 - 产品描述 - 等等 -ProductDetail 表包含您想要支持的语言的所有翻译(产品名称、描述等)。根据您应用的要求,您可能希望将 Country 表分解为也使用区域语言。
【讨论】:
我正在使用下一种方法:
ProductID 订单ID,...
ProductID 标题名称 LanguageID
LanguageID 名称文化,....
【讨论】:
Martin 的解决方案与我的非常相似,但是如果找不到所需的翻译,您将如何处理默认描述?
每个字段是否需要一个 IFNULL() 和另一个 SELECT 语句?
默认翻译将存储在同一个表中,其中像“isDefault”这样的标志指示该描述是否是默认描述,以防当前语言没有找到。
【讨论】: