数据库本地化
我有许多数据库表,其中包含需要本地化的name
和description
列。 我最初尝试设计一个支持这个数据库的数据库模式就像这样:
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