创建多语言数据库的最佳方法是什么?为每个表创建本地化的表使设计和查询变得复杂,在其他情况下为每种语言添加列简单但不动态,请帮助我了解什么是企业应用程序的最佳选择
我们要做的是为每个多语言对象创建两个表。
例如,第一个表只包含与语言无关的数据(主键等),第二个表包含每种语言的一条记录,包含本地化数据和该语言的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):请查看这个答案,了解用于将多语言数据加载到应用程序中的实现的一些附加信息。
我发现这种方法很适合我:
Product ProductDetail Country ========= ================== ========= ProductId ProductDetailId CountryId - etc - ProductId CountryName CountryId Language ProductName - etc - ProductDescription - etc -
ProductDetail表保存了您想要支持的语言的所有翻译(产品名称、描述等)。根据应用程序的需求,您可能希望将国家表分解为使用区域语言。
我将使用下一种方法:
产品
ProductID OrderID,……
ProductInfo
ProductID标题名称语言id
语言
LanguageID名称区域性,....
我推荐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");
我相信你能做得更好。
关键是要以统一的方式命名表和字段。
Martin的解决方案与我的非常相似,但是当没有找到所需的翻译时,您将如何处理默认描述?
这是否需要为每个字段使用IFNULL()和另一个SELECT语句?
默认翻译将存储在同一个表中,其中像“isDefault”这样的标志表示在没有找到当前语言的情况下,该描述是否是默认描述。
推荐文章
- 多语言数据库设计的最佳实践是什么?
- 如何从表中导出所有数据到可插入的sql格式?
- 如何将时间按小时或10分钟分组?
- 什么时候不使用Cassandra?
- 如何在Oracle SQL开发人员中找到引用给定表的表?
- 使用sql查询将字符串转换为int
- 在postgresql中将查询结果按月和年分组
- my.cnf文件在macOS上的位置
- 索引中列的顺序有多重要?
- 在SQL Server中做嵌套case语句逻辑的最佳方法
- 如何创建默认值“现在”的时间戳列?
- 准备好的语句如何防止SQL注入攻击?
- 如何改变一个列的数据类型在PostgreSQL表?
- 如何结合日期从一个字段与时间从另一个字段- MS SQL Server
- 我如何得到“id”后插入到MySQL数据库与Python?