什么是保持多语言数据的最佳数据库结构?

可能重复:
多语言数据库的架构

这是一个例子:

[ products ]
id (INT)
name-en_us (VARCHAR)
name-es_es (VARCHAR)
name-pt_br (VARCHAR)
description-en_us (VARCHAR)
description-es_es (VARCHAR)
description-pt_br (VARCHAR)
price (DECIMAL)

问题:每一种新语言都需要修改表结构。

这是另一个例子:

[ products-en_us ]
id (INT)
name (VARCHAR)
description (VARCHAR)
price (DECIMAL)

[ products-es_es ]
id (INT)
name (VARCHAR)
description (VARCHAR)
price (DECIMAL)

问题是:每一种新语言都需要创建新表格,而“价格”字段在每个表格中都是重复的。

这是另一个例子:

[ languages ]
id (INT)
name (VARCHAR)

[ products ]
id (INT)
price (DECIMAL)

[ translation ]
id (INT, PK)
model (VARCHAR) // product
field (VARCHAR) // name
language_id (INT, FK) 
text (VARCHAR)

问题: fuc * ing很难?


你的第三个例子实际上是解决问题的方式。 很难但可行。

从翻译表中删除对产品的参考,并在需要的地方提供翻译参考(反之亦然)。

[ products ]
id (INT)
price (DECIMAL)
title_translation_id (INT, FK)

[ translation ]
id (INT, PK)
neutral_text (VARCHAR)
-- other properties that may be useful (date, creator etc.)

[ translation_text ]
translation_id (INT, FK)
language_id (INT, FK) 
text (VARCHAR)

作为替代方案(不是特别好),您可以拥有一个字段,并将所有翻译合并在一起(例如XML)。

<translation>
  <en>Supplier</en>
  <de>Lieferant</de>
  <fr>Fournisseur</fr>
</translation>

类似于方法3:

[languages]
id (int PK)
code (varchar)

[products]
id (int PK)
neutral_fields (mixed)

[products_t]
id (int FK)
language (int FK)
translated_fields (mixed)
PRIMARY KEY: id,language

因此,对于每个表格,制作另一个表格(在我的例子中用“_t”后缀)来保存翻译的字段。 当您SELECT * FROM products ,只需... LEFT JOIN products_t ON products_t.id = products.id AND products_t.language = CURRENT_LANGUAGE

不那么难,让你摆脱头痛。


为了减少JOIN的数量,您可以将翻译和非翻译保留在2个独立的表格中:

[ products ]
id (INT)
price (DECIMAL)

[ products_i18n ]
id (INT)
name (VARCHAR)
description (VARCHAR)
lang_code (CHAR(5))
链接地址: http://www.djcxy.com/p/37435.html

上一篇: What's the best database structure to keep multilingual data?

下一篇: converting string to enum