什么是创建多语言数据库的最佳方式?为每个表创建本地化表格会使设计和查询复杂,另一种情况是为每种语言添加列很简单但不够灵活,请帮助我理解什么是企业应用的最佳选择。
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日):请查看这个答案,了解有关将多语言数据加载到应用程序中使用的实现的一些附加信息。
IsDefault
语言标志应该添加到语言表中,而不是ProductTranslations
表中,因为对于所有产品来说,默认语言都是相同的。 - MD. IBRAHIM KHALIL TANIM我推荐 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");
我相信你甚至可以做得更好。
关键在于将你的表格和字段以统一的方式命名。
我发现这种方法适合我:
产品 产品详情 国家 ========= ================== ========= 产品编号 产品详情编号 国家编号 - 等等 - 产品编号 国家名称 国家编号 语言 产品名称 - 等等 - 产品描述 - 等等 -
“ProductDetail”表存储所有需要翻译的内容(例如产品名称、描述等)对应的各种语言版本。根据您的应用程序要求,您可能希望将“Country”表拆分为区域性语言。
我正在使用以下方法:
产品ID 订单ID,...
产品ID 标题 名称 语言ID
语言ID 名称 区域,....
Martin的解决方案和我的非常相似,但是如果找不到所需的翻译,你将如何处理默认描述?
这是否需要一个IFNULL()和另一个SELECT语句来处理每个字段?
默认翻译将存储在同一张表中,其中一个标志(例如“isDefault”)表示该描述是否为默认描述,以防当前语言没有找到任何描述。