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):请查看此答案,了解有关用于将多语言数据加载到应用程序的实现的一些其他信息.
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表分解为使用区域语言.
omo*_*oto 10
我正在使用下一个方法:
ProductID OrderID,...
ProductID标题名称LanguageID
LanguageID名称文化,....
| 归档时间: |
|
| 查看次数: |
114334 次 |
| 最近记录: |