Possible Duplicate:
Schema for a multilanguage database

下面是一个例子:

[ 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)

The problem:每种新语言都需要修改表 struct .

下面是另一个例子:

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

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

The problem:每种新语言都需要创建新表,"价格"字段在每个表中重复.

下面是另一个例子:

[ 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)

The problem:难吗?

推荐答案

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

从翻译表中删除对产品的引用,并将对翻译的引用放在需要的地方(反之亦然).

[ 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>

Mysql相关问答推荐

AWS RDS上的MySQL复制错误:超级权限或REPLICATION_SLAVE_ADMIN权限的访问被拒绝

找出同一表中列A中的每个值在列B中出现的次数

如何在MySQL中检索两列的值不同的行

如何跨多个产品查找相同时间范围的数据集

MySQL中如何对字符串进行算术运算?

错误 2020 (HY000): 数据包大于 'max_allowed_pa​​cket' 字节,docker 容器内出现 mysql 错误

MySQL 关于 JSON 数组和子查询的问题

如何在 SQL 中迭代所有名称和排名排列

MySQL Procedure 变量在 count(*) 上接收 null

错误1075:表定义不正确;只能有一个自动列,它必须定义为一个键(使用 gorm 和 mysql)

如何在 mysql 的 group by 子句中 Select 最后创建的记录?

MySql部分匹配基于部分查询代码

在一个 SQL 查询中对同一列中相同类型的不同值求和

SUBSTRING_INDEX 获取第 n 个值

MySQL - 使一对值唯一

不正确的整数(2147483647)被插入到 MySQL 中?

如何在 MySQL 中为用户设置默认架构

mysql中float(2,2)和float()的区别

MySQL错误 1005 (HY000): 无法创建表 'foo.#sql-12c_4' (errno: 150)

MySQL:切换 int 字段值的简单方法