我正在开发一种多语言软件。就应用程序代码而言,可本地化性不是问题。我们可以使用特定于语言的资源,并拥有与之配合使用的各种工具。
但是,定义多语言数据库架构的最佳方法是什么?假设我们有很多表(100个或更多),每个表可以有多个可以本地化的列(大多数nvarchar列应该可以本地化)。例如,其中一个表可能包含产品信息:
CREATE TABLE T_PRODUCT ( NAME NVARCHAR(50), DESCRIPTION NTEXT, PRICE NUMBER(18, 2) )
我可以想到三种支持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) )
带有每种语言列的翻译表
代替存储翻译的文本,仅存储翻译表的外键。翻译表包含每种语言的列。
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 )
每种语言都有行的翻译表
代替存储翻译的文本,仅存储翻译表的外键。翻译表仅包含一个键,而单独的表则包含每种语言翻译的一行。
CREATE TABLE T_PRODUCT ( NAME_FK int, DESCRIPTION_FK int, PRICE NUMBER(18, 2) ) CREATE TABLE T_TRANSLATION ( TRANSLATION_ID ) CREATE TABLE T_TRANSLATION_ENTRY ( TRANSLATION_FK, LANGUAGE_FK, TRANSLATED_TEXT NTEXT ) CREATE TABLE T_TRANSLATION_LANGUAGE ( LANGUAGE_ID, LANGUAGE_CODE CHAR(2) )
每种解决方案都各有利弊,我想知道您在使用这些方法时的经验,您的建议以及如何设计多语言数据库架构。
您如何看待每个可翻译表的相关翻译表?
创建表T_PRODUCT(pr_id int,价格NUMBER(18,2)) 创建表T_PRODUCT_tr(pr_id INT FK,语言代码varchar,pr_name文本,pr_descr文本)
创建表T_PRODUCT(pr_id int,价格NUMBER(18,2))
创建表T_PRODUCT_tr(pr_id INT FK,语言代码varchar,pr_name文本,pr_descr文本)
这样,如果您有多个可翻译列,则只需一个联接即可获取它,因为您没有自动生成Translationid,因此将项及其相关翻译一起导入可能会更容易。
不利的一面是,如果您具有复杂的语言回退机制,则可能需要为每个转换表实现该功能-如果您依靠某些存储过程来做到这一点。如果您通过应用程序执行此操作,则可能不会出现问题。
让我知道您的想法-我还将就下一个应用程序做出决定。到目前为止,我们已经使用了您的第三种类型。