我有一个数字,包含数据库表的name
和description
,需要加以本地化列。 我在设计数据库架构初步尝试,将支持这是这样的:
product
-------
id
name
description
local_product
-------
id
product_id
local_name
local_description
locale_id
locale
------
id
locale
然而,这种解决方案需要一个新的local_
为包含每个表的表name
,要求和说明列localization
。 在试图避免这种开销,我重新设计架构,以便只有一个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
表。
谢谢,唐
Answer 1:
我认为这是很好。 你描述一个产品,其本土化文本间的一种一对多的关系。
我想知道,如果你也应该本地化,而不是你的产品的表非规范化它的英文。
Answer 2:
我喜欢这个主意,但会走在其他方向迈出的一步,并有每一个被翻译列本地化条目:
国家
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(因为您的高速缓存键入基于语言的话)。
你也可以考虑留在默认的名称和说明字段产品表,这将在情况下,习惯于某个条目丢失当前语言,或进入时,用户没有指定的语言。 这也将是如果你是移植现有的应用程序的情况下,你已经有了值有(无区域信息)。
Answer 3:
正确的方法,我觉得,是创建额外的表,但后来去了额外的步骤,并从第一个表中删除所有的语言特定资源。
所以,你必须:
产品
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
Answer 4:
如果我理解正确的,因为你要使用的名称和描述相同languale定位在一个以上的表您的问题仅仅是。 在这种情况下,你不能在定位表中添加的PROD_ID。 在您的设计还有一个问题是,它不能对同一产品处理多个语言本地化典雅。 你可以调整它的工作:
如果名称和说明是需要本地化的唯一领域,你可以做到以下几点。
产物(ID,名称,描述,tanslation_row_id)
Product_translations(ID,名称,描述,LANG_ID,translation_id)
该translation_row_id将是Product_translations.ID的translation_id会,在将作为所有语言的特定记录的公共记录的同桌却指向父记录外键指向。
示例记录
产品
(ID, name, description, translation_row_id)
(p1, apples,a red fruit, tr1)
(p2, mango, a yellow fruit, tr2)
Product_translations
(ID, name, description, lang_id, translation_id)
(tr1, apples, a red fruit, ENU, null)
(tr2, mango, a yellow fruit, null)
(tr3, pomme,un fruit rouge, FRA,tr1)
(tr4, mangue,a yellow fruit, SPA,tr2)
给定一个语言代码,你可以使用FOLL SQL查询提取名称和描述值
select T.name, T.description
from product_translations T
where T.translation_id =
(select T2.ID
from Product P,Product_translations T2
where P.translation_row_id = t2.ID
)
and T.lang_id = '&langID';
重要提示:我假设产品表有许多不需要这个翻译更多的属性。 “&LANGID”是SQL查询,将询问用户他所选择的语言代码的参数
文章来源: Database localization