我正在开发一种多语言软件.就应用程序代码而言,可本地化不是问题.我们可以使用特定于语言的资源,并拥有适合他们的各种工具.
但是,定义多语言数据库模式的最佳方法是什么?假设我们有很多表(100或更多),每个表可以有多个可以本地化的列(大多数nvarchar列应该是可本地化的).例如,其中一个表可能包含产品信息:
CREATE TABLE T_PRODUCT (
NAME NVARCHAR(50),
DESCRIPTION NTEXT,
PRICE NUMBER(18, 2)
)
Run Code Online (Sandbox Code Playgroud)
我可以想到三种方法来支持NAME和DESCRIPTION列中的多语言文本:
每种语言的单独列
当我们向系统添加新语言时,我们必须创建其他列来存储翻译后的文本,如下所示:
CREATE TABLE T_PRODUCT (
NAME_EN NVARCHAR(50),
NAME_DE NVARCHAR(50),
NAME_SP NVARCHAR(50),
DESCRIPTION_EN NTEXT,
DESCRIPTION_DE NTEXT,
DESCRIPTION_SP NTEXT,
PRICE NUMBER(18,2)
)
Run Code Online (Sandbox Code Playgroud)翻译表与每种语言的列
不存储翻译的文本,而是仅存储翻译表的外键.转换表包含每种语言的列.
CREATE TABLE T_PRODUCT (
NAME_FK int,
DESCRIPTION_FK int,
PRICE NUMBER(18, 2)
)
CREATE TABLE T_TRANSLATION (
TRANSLATION_ID,
TEXT_EN NTEXT,
TEXT_DE NTEXT,
TEXT_SP NTEXT
)
Run Code Online (Sandbox Code Playgroud)用于每种语言的行的转换表
不存储翻译的文本,而是仅存储翻译表的外键.转换表仅包含一个键,而一个单独的表包含每个语言转换的行.
CREATE TABLE T_PRODUCT (
NAME_FK int,
DESCRIPTION_FK int,
PRICE NUMBER(18, 2)
)
CREATE TABLE T_TRANSLATION ( …Run Code Online (Sandbox Code Playgroud)我将开始研究中型应用程序,我正在计划它的数据库设计.我不确定的一件事是这个.我将有许多表需要国际化,例如:"membership_options,gender_options,language_options等"
这些表中的每一个都将共享常见的i18n字段,例如:"title,alternative_title,short_description,description"
在您看来哪种方式最好?有一个i18n表,每个表需要它们具有相同的字段吗?
或做类似的事情:
Membership table Gender table
---------------- --------------
id | created_at id | created_at
1 - 22.03.2001 1 - 14.08.2002
2 - 22.03.2001 2 - 14.08.2002
General translation table
-------------------------
record_id | table_name | string_name | alternative_title| .... |id_language
1 - membership regular null 1 (english)
1 - membership normale null 2 (italian)
1 - gender man null 1(english)
1 -gender uomo null 2(italian)
Run Code Online (Sandbox Code Playgroud)
这会避免我重复这样的事情:
membership_translation table
-----------------------------
membership_id | name | alternative_title | id_lang
1 regular null …Run Code Online (Sandbox Code Playgroud)