数据库本地化

我有许多数据库表,其中包含需要本地化的namedescription列。 我最初尝试设计一个支持这个数据库的数据库模式就像这样:

product
-------
id
name
description


local_product
-------
id
product_id
local_name
local_description
locale_id


locale
------
id
locale

但是,此解决方案需要为包含需要localization name和说明列的每个表创建一个新的local_ 。 为了避免这种开销,我重新设计了模式,以便只需要一个localization

product
-------
id
localization_id


localization    
-------
id    
local_name
local_description
locale_id


locale
------
id
locale

以下是当需要本地化的2个表格(产品和国家)时将存储在该模式中的数据的示例:

国家

id,     localization_id
-----------------------
1,      5

产品

id,     localization_id
-----------------------
1,      2

本土化

id,     local_name,   local_description,     locale_id
------------------------------------------------------
2,      apple,        a delicious fruit,     2
2,      pomme,        un fruit délicieux,    3
2,      apfel,        ein köstliches Obst,   4
5,      ireland,      a small country,       2
5,      irlande,      un petite pay,         3

现场

id,     locale
--------------
2,      en
3,      fr
4,      de

请注意, localization表的复合主键是(id, locale_id) ,但product表中的外键仅指该化合物PK的第一个元素。 这似乎是正常化POV的“坏事”。

有什么办法可以解决这个问题吗?或者,是否有完全不同的模式支持本地化,而无需为每个可本地化的表创建单独的表?

更新:许多受访者提出了一个解决方案,要求为每个可本地化的表创建一个单独的表。 但是,这正是我想要避免的。 我上面提出的方案几乎解决了这个问题让我满意,但我不满的事实localization_id外键仅指在相应的主键的一部分localization表。

谢谢,唐


我认为这很好。 您正在描述产品与其本地化文本之间的一对多关系。

我想知道你是否应该将英语本地化,而不是在产品表中反规范化。


我喜欢这个想法,但会朝着另一个方向迈出一步,并且为翻译的每一列都有一个本地化条目:

国家

id,     localization_id
-----------------------
1,      5

产品

id,     name_locale_id,  description_locale_id
----------------------------------------------
1,      2,               8

本土化

id,     locale_id,    value
------------------------------------------------------
2,      2             apple
2,      3             pomme
2,      4             apfel
5,      2             ireland
5,      3             irlande
8,      2             a delicious fruit
8,      3             un fruit délicieux
8,      4             ein köstliches Obst
9,      2             a small country
9,      3             un petite pay

现场

id,     locale
--------------
2,      en
3,      fr
4,      de

本地化的PK是(id,locale_id)。 在其他几个表中,id也是FK参考是没有问题的。 如果你愿意,你可以添加一个代理PK,只要你在(id,locale_id)上还有一个唯一索引。

关于这一点的好处是它是一个单独的本地化表,它适用于模式中的任何表,无论它具有哪些字段(您不限于具有本地化的名称和描述)。 缺点是在使用本地化表时潜在的性能受到影响 - 尽管潜在地,您可以缓存给定locale_id的整个内容,所以当您查找条目时,您只需查找给定的ID(因为您的缓存是基于该语言键控)。

您还可以考虑在产品表中保留默认的名称和说明字段,以便在缺少当前语言条目的情况下使用,或者在输入时用户未指定语言。 如果你正在移植一个现有的应用程序,那么你也会有这种情况(没有语言环境信息)。


我觉得,正确的方法是创建额外的表格,但是执行额外的步骤并从第一个表格中删除所有语言特定的资源。

所以你会有:

产品

id 
-name removed
-description removed

产品本地化

productid, locale_id, name,   description
------------------------------------------------------
1,         3,         pomme,  un fruit délicieux
1,         4,         apfel,  ein köstliches Obst
1,         1,         apple,  a delicious fruit

现场

id,     locale
--------------
1,      en
3,      fr
4,      de
链接地址: http://www.djcxy.com/p/37453.html

上一篇: Database localization

下一篇: What are best practices for multi