`
radzhang
  • 浏览: 313004 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

多语言系统的数据库设计

 
阅读更多

转自:

https://www.cnblogs.com/lhyqzx/p/5959621.html

 

多语言系统的数据库设计

首先我们需要确认我们要做的系统,多语言到底是要做多少种语言,以后会不会要求增加更多的语言。比如我们做一个给中国大陆和纽伦新港使用的系统,可以确定的语言就是简体中文、繁体中文和英语,而且可以确定以后也不会增加语言。确定以后是否需要增加语言这一点很重要,决定了我们在数据库设计时,是否需要考虑多语上的扩展性。

先说下在数据库设计时,可以有以下方案实现多语:

一、为每个多语字段建立对应语言的字段列。

比如我们有一个客户表,记录了客户Id、客户名称、客户地址、客户电话等,其中客户名称和客户地址是多语的,而且需要支持简体中文、繁体中文和英语,于是我们可以将客户表设计如下:

create table Client
(
    ClientId int primary key,
    NameChs nvarchar(50),
    NameCht nvarchar(50),
    NameEng varchar(200),
    AddressChs nvarchar(50),
    AddressCht nvarchar(50),
    AddressEng varchar(200),
    TelephoneNumber varchar(50)
)

这样做的优点是容易理解,容易查询,一个客户实例对应的就是数据库中的一条数据,与普通的非多语数据库无异,而且由于没有形成新的表,所以也不需要额外的Join,所以查询效率很高:

insert into Client values(1,'工商银行','工商銀行','ICBC','中国北京','中國北京','China,Beijing','13811255555');

select *
from Client c
where c.ClientId=1

二、建立统一的翻译表,在翻译表中使用多列存储多语言,然后在实体表中外键引用翻译表。

create table Translation 
(
    TranslationId int primary key,
    TextChs nvarchar(200),
    TextCht nvarchar(200),
    TextEng varchar(200),
)

create table Client
(
    ClientId int primary key,
    NameTranId int references Translation(TranslationId),
    AddressTranId int references Translation(TranslationId),
    TelephoneNumber varchar(200)
)

这样要查询数据时,需要将Translation表JOIN2次,获得对应的Name和Address的多语。

insert into Translation values(10,'工商银行','工商銀行','ICBC');
insert into Translation values(20,'中国北京','中國北京','China,Beijing');
insert into Client values(1,10,20,'13811255555');

select c.ClientId,c.TelephoneNumber,
tn.TextChs as NameChs,tn.TextCht as NameCht,tn.TextEng as NameEng,
ta.TextChs as AddressChs,ta.TextCht as AddressCht,ta.TextEng as AddressEng
from Client c
inner join Translation tn
on c.NameTranId=tn.TranslationId
inner join Translation ta
on c.AddressTranId=ta.TranslationIdwhere 
where c.ClientId=1

以上介绍的方法都是将多语作为列输出,也就是说有多少种语言就会有多少对于的列,不利于语言的增加下面再介绍将语言以数据行的形式保存的设计方法,这种方法可以在后期任意增加语言而不改动数据库Schema.

三、将每个表中需要多语的字段独立出来,形成一个对应的多语表。

多语表外键关联原表,每个需要多语的字段在多语表中对应一列,多语表中增加“语言”字段。同样以Client表为例,那么对应的表结构是:

create table Client
(
    ClientId int primary key,
    TelephoneNumber varchar(200)
)
create table Client_MultiLanguages
(
    CLId int primary key,
    ClientId int references Client(ClientId),
    Name nvarchar(200),
    Address nvarchar(200),
    Language char(3)
)

这样的优点是便于扩展,在Schema中并没有定义具体的语言,所以如果要增加语言的话,只需要在多语表中增加一行对应的数据即可。查询也相对比较简单,执行要将原表与对应的多语表JOIN,然后跟上具体的语言作为WHERE条件,即可完成对数据的查询,比如要查询Id为1的Client对象的英语实例:

insert into Client values(1,'13811255555');
insert into Client_MultiLanguages values(1,1,'工商银行','中国北京','CHS');
insert into Client_MultiLanguages values(2,1,'工商銀行','中國北京','CHT');
insert into Client_MultiLanguages values(3,1,'ICBC','China,Beijing','ENG');

select c.*,cm.Name,cm.Address
from Client c inner join Client_MultiLanguages cm
on c.ClientId=cm.ClientId
where c.ClientId=1 and cm.Language='ENG'

 

四、建立统一翻译表和对应的多语表,在每个多语列指向翻译表。

create table Translation 
(
    TranslationId int primary key
)

create table Client
(
    ClientId int primary key,
    NameTranId int references Translation(TranslationId),
    AddressTranId int references Translation(TranslationId),
    TelephoneNumber varchar(200)
)


create table TranslationEntity 
(
    TranslationEntityId int primary key,
    TranslationId int references Translation(TranslationId),
    Language char(3),
    TranslatedText nvarchar(200)
)

如果要查询Id为1的Client对应的英语实例,那么脚本为:

insert into Translation values(10);
insert into Translation values(20);
insert into Client values(1,10,20,'13811255555');
insert into TranslationEntity values(1,10,'CHS','工商银行');
insert into TranslationEntity values(2,10,'CHT','工商銀行');
insert into TranslationEntity values(3,10,'ENG','ICBC');
insert into TranslationEntity values(4,20,'CHS','中国北京');
insert into TranslationEntity values(5,20,'CHT','中國北京');
insert into TranslationEntity values(6,20,'ENG','China,Beijing');


select c.ClientId,tne.TranslatedText as Name,tae.TranslatedText as Address,c.TelephoneNumber
from Client c
inner join TranslationEntity tne
on c.NameTranId=tne.TranslationId
inner join TranslationEntity tae
on c.AddressTranId=tae.TranslationId
where c.ClientId=1 and tne.Language='ENG' and tae.Language='ENG'

这个数据的插入和查询也太复杂了。同时也可以注意到在查询时根本没有用到Translation表,其实这个表只是标识每个数据实例中的多语字段,可以直接使用数据库的Sequence生成或者使用GUID,只要保证全局唯一即可。另外也可以注意到在查询时JOIN了2次TranslationEntity 表,如果一个表的多语字段比较多,比如有10个字段有多语,那么查询是就需要JOIN10次,这个效率会很低。另外还可以注意到,在WHERE条件中写了2次Language='ENG',如果多个多语字段,那么就要写多次。刚才这个查询写的不够严谨,因为不能保证Name字段和Address字段必然就有英文值,如果没有英文值会导致查询结果为空,所以正确的写法应该是:

select c.ClientId,tne.TranslatedText as Name,tae.TranslatedText as Address,c.TelephoneNumber
from Client c
left join TranslationEntity tne
on c.NameTranId=tne.TranslationId  and tne.Language='ENG'
left join TranslationEntity tae
on c.AddressTranId=tae.TranslationId and tae.Language='ENG'
where c.ClientId=1 

实际项目中,如果我们使用了NHibernate等ORMapping工具,那么多语字段就会映射成一个集合,所以对于某种语言的实例,那么需要执行N+1次SQL查询,而不是JOIN查询,N是该对象中多语的属性个数.

分享到:
评论

相关推荐

    在线考试系统数据库的设计与实现

    总的来说,在线考试系统数据库的设计与实现是一个涵盖广泛领域的项目,涉及到数据库理论、编程实践、系统架构等多个方面。通过合理的设计和实现,可以构建出一个高效、稳定且安全的在线考试平台。

    图书馆管理系统数据库设计

    图书馆管理系统数据库设计是一个重要的课程设计任务,旨在让学生掌握计算机管理信息系统设计的基本方法,特别是关系型数据库管理系统的设计与应用。在这一任务中,学生需要完成一个能够处理图书馆日常业务的系统,...

    工资管理系统数据库课程设计

    总的来说,《工资管理系统数据库课程设计》是一份全面的实践教程,涵盖了数据库设计、编程技术、软件工程等多个方面的知识。通过学习和实践,学生不仅可以深化对数据库原理的理解,还能掌握实际开发中的问题解决技巧...

    OA 协同办公系统 数据库设计说明书(附数据库关系表)

    在 OA 协同办公系统数据库设计中,需要使用到多种技术和工具,包括关系数据库管理系统(RDBMS)、数据库设计工具、SQL 语言等。数据库设计者需要具备丰富的技术知识和经验,包括数据库设计原则、数据库管理系统、...

    人事管理系统——数据库课程设计

    其次,"完整数据库"表示系统具备完整的数据存储和检索功能,这涵盖了数据库设计、SQL查询以及事务处理等多个方面;最后,"人事管理系统"提示我们,这个应用的主要功能是管理人事信息,如员工档案、招聘、工资单、...

    医院管理系统 数据库课程设计

    综上所述,"医院管理系统 数据库课程设计"涵盖了数据库设计的基本原理和实践操作,通过这个项目,学生可以深入学习数据库的规划、设计、实现和维护,同时了解业务流程与数据管理的关系,为今后从事信息系统开发积累...

    图书管理系统数据库设计

    总的来说,图书管理系统数据库设计涵盖了数据库设计的全过程,从需求收集到系统上线,涉及多个层面的技术,如数据库理论、软件工程方法、编程技术等。通过这样的设计和实现,可以构建一个功能完备、易用且安全的图书...

    职工考勤管理系统数据库设计

    总的来说,职工考勤管理系统数据库设计是一项综合性的任务,涉及到数据管理、系统架构、人机交互等多个领域。通过合理的设计和实施,可以实现考勤管理的自动化、智能化,为企业带来更高的效率和精确度。

    系统设计规范和模板word+pdf版(架构设计、概要设计、详细设计和数据库设计)

    在IT行业中,系统设计是软件开发过程中的关键环节,它涉及到架构设计、概要设计、详细设计和数据库设计等多个步骤。这些步骤都是确保项目成功、高效且可维护的关键。以下是对这些知识点的详细阐述: 1. **架构设计*...

    数据库系统设计模拟试题三

    本篇内容主要涉及“数据库系统设计”这一...综上所述,这些知识点涵盖了数据库系统设计的多个方面,包括体系结构、数据建模、数据库设计流程、SQL操作、以及特定开发工具的使用,这些都是理解和设计数据库系统的基础。

    数据库课程设计学生宿舍管理系统

    7. **文档编写**:完整的项目应该附带详细的设计文档,包括系统需求、数据库设计说明、功能模块描述、系统架构图、流程图等,方便他人理解和维护。 8. **软件工程方法**:开发过程可能遵循敏捷开发、瀑布模型或其他...

    医院管理系统 数据库课程设计(源码+课程设计)

    总之,这个医院管理系统数据库课程设计项目涵盖了数据库设计与管理、Web开发、系统分析与设计等多个IT领域的知识点,对于提升学生的实践能力和理论知识有极大的帮助。通过这样的项目,学生可以更好地理解如何将课堂...

    数据库课程设计 医院管理系统

    综上所述,"数据库课程设计-医院管理系统"涵盖了数据库设计理论、SQL编程、Java应用开发、业务流程理解、用户界面设计、异常处理、安全性和测试等多个IT领域的知识点,是学习和实践IT技能的综合性项目。通过这个项目...

    数据库系统原理实验五/大作业:数据库设计与应用开发大作业

    本次实验——数据库系统原理实验五/大作业,旨在帮助学生深入理解数据库设计的整个流程,并培养他们将理论知识转化为实际应用的能力。 实验的第一个重点是掌握数据库设计的基本方法。这涉及到从概念结构设计开始,...

    数据库成绩管理系统数据库综合设计

    总的来说,这个数据库成绩管理系统项目涵盖了数据库设计基础、SQL语言应用、软件工程中的需求分析和代码实现等多个方面的知识点。通过研究这个项目,不仅可以了解如何设计和实现一个简单的成绩管理系统,还能深入...

    数据库课程设计超市管理系统完整版

    总的来说,这个超市管理系统完整版是一个综合性的项目,涵盖了数据库设计、C++编程和系统集成等多个方面的知识。对于参与课程设计的学生而言,这是一次宝贵的实践经验,能够提升他们的实际操作能力和问题解决能力,...

    图书管理系统(数据库课程设计java)

    【图书管理系统(数据库课程...总的来说,【图书管理系统(数据库课程设计java)】项目涵盖了数据库设计、Java编程、GUI开发、业务逻辑实现、数据访问以及系统集成等多个IT领域的知识,是学习和实践这些技能的好实例。

    数据库课程设计机票预定系统

    【机票预定系统数据库设计】 机票预定系统是一种基于数据库的信息管理系统,它主要用于收集、存储和处理与机票预订相关的数据。在设计这样一个系统时,通常会涉及以下几个核心知识点: 1. **SQL语言**:SQL...

    数据库课程设计—餐饮管理系统完整版源码

    总的来说,这个餐饮管理系统项目是一个综合性的学习资源,涵盖了C++编程、数据库设计与操作、图形用户界面开发、异常处理、项目构建等多个方面,对于想要提升自己在IT领域尤其是软件开发方面技能的学生或初学者来说...

Global site tag (gtag.js) - Google Analytics