`
radzhang
  • 浏览: 302597 次
  • 性别: 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是该对象中多语的属性个数.

分享到:
评论

相关推荐

    执法案件管理系统-数据库设计.docx

    执法案件管理系统-数据库设计 执法案件管理系统 数据库设计 执法案件管理系统-数据库设计全文共24页,当前为第1页。 执法案件管理系统-数据库设计全文共24页,当前为第2页。 执法案件管理系统-数据库设计全文共24页...

    数据库系统设计SQL语言

    本设计针对信息处理能力在现在化工厂中的重要作用,且作为工厂的生产基地——工厂也必须适应这一变化趋势的要求,也就是说工厂的建设、管理应该向着信息化、智能化、系统化、规范化和自动化的方向发展,基于这种社会...

    人事工资管理系统数据库设计.doc

    人事工资管理系统 1问题...3数据库设计 4。3.1数据库介绍 所谓数据库(Database)就是指按一定组织方式存储在一起的,相互有关的若 干个数据的结合,数据库管理系统(database Management System)就是一种操纵和管理

    数据库系统设计实验报告.doc

    实验目的 掌握数据库设计的基本方法和步骤,熟悉数据库设计各个阶段所要完成的任务和实施 方法。通过该实验更加清楚地了解数据库设计的过程。 2.实验原理和步骤 利用数据库设计的4个阶段:需求分析(分析用户要求)、...

    花店管理系统-数据库设计.doc

    为了更好的巩固和加强书本所学的知识,并把所学的东西转化为实际应用,在这里我进 行花店管理系统数据库的设计。通过把花店管理系统的构造以及采购的信息还有鲜花, 店员的相关信息制成表格,输入到数据库中,使之...

    《数据库课程设计》_大作业仓库管理系统设计与开发.docx

    使用ASP VBScript作为开发语言,SQL Server 2008作为后台数据库,该数据库系统在安全性、准确性、运行速度方面均有绝对的优势,并且能够对容量较大的数据库进行处理, 效率高。系统有较高的安全性和较好的性能。 ...

    多语言系统的数据库设计.pdf

    多语⾔系统的数据库设计 多语⾔系统的数据库设计 之前做的项⽬涉及到中国⼤陆和纽伦新港的⽤户使⽤,也就需要做成⼀个多语⾔的系统,现在总结下其中⼀些经验和思考。 ⾸先我们需要确认我们要做的系统,多语⾔到底是...

    网吧管理系统数据库课程设计.doc

    大型数据库课程设计 设计报告 题 目: 网吧管理系统数据库 学 号: 学生姓名: 指导教师: 提交时间: 2013-11-23 第1章 需求分析 1。1 需求分析任务 1。2 需求分析过程 1.3 数据字典和流程图 1。4 系统功能分析 ...

    数据库应用系统设计与实现

    数据库应用系统设计与实现 实验类型:设计型 实验地点:2楼312 实验时间:12月14日、21日周五1-3/5-7节 实验内容: 系统概述: 某银行需要开发ATM存取款机系统实现如下功能: 1)开户(到银行填写开户申请单,卡号...

    会议管理系统数据库设计文档.doc

    如果使用数字 类型分别用1、0代表高职、中职、低职,则入库的是数字信息,从程序编写的角度考虑 ,后者更好维护一些,主要体现在如果是多语言版本时,我们不需要在程序中将这些字 符串信息进行判断处理。 1 数据库...

    数据库课程设计—企业工资管理系统(java版+完整代码).doc

    工资信息管理系统数据库中各个表格的设计结果如下面的几个表格所示。每个表格表 示在数据库中的一个表。 表一:员工信息表: "列名 "数据类型 "可否取空 "备注说明 " "no " Char ( 8 ) "NOT NULL "职工号(主键) ...

    工作流数据库设计.pdf

    3 表单采用简单的 html+控制标签的方法实现 4 权限和模板引擎,以及其它辅助函数直接使用办公系统自带的框架 5 充分利用 PHP 语言的特点,流程设计是基于数据库的,程序上使用 OO 设计,但采用重 对象的方法 6 不把...

    Python数据库课程设计:点菜订餐管理信息系统【含报告】 Django + Bootstrap + jQuery

    设计要求:该系统设计实现时主要从以下三个角色方面入手进行,每个角色具有不同功能: 用户端功能: 顾客进入系统浏览整体菜单; 顾客根据菜单进行选菜下单点菜; 顾客通过核对订单进行结账。 后台管理功能: 管理...

    电话计费管理系统【SQLServer数据库+课程设计文档】

    电话计费管理系统【SQLServer数据库+课程设计文档】 一、需求分析 1.1任务概述 1.2功能定义 1.3流程图定义 1.4数据字典(简称DD) 1.5 功能模块分析 1.6数据流图 二、概要设计 2.1概述 2.2系统E-R ...

    数据库设计培训.pptx

    数据库设计 术语及定义 概念模型:概念模型用于信息世界的建模,是现实世界到信息世界的第一层抽象,是数据库设计人员进行数据库设计的有力工具,也是数据库设计人员和用户之间进行交流的语言。它可以真实、充分地...

    数据库课程设计网吧管理系统.doc

    五、功能结构图: 网吧管理系统模块 时间设定模块 第四章 数据库设计 二、逻辑设计: 下面列出几个主要的数据库表设计: 4。1 ClientIP表: "序号 "中文名 "字段名 "类型 "备注 " "0 "ID "3 "字符型 "主键 " "1 "IP ...

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

    数据库课程设计报告,附带sql语言及数据库,对应数据库应用web,由C#制作开发,bug较多,功能有限

    数据库系统概念 英文版 原书第6版

    本书内容丰富,不仅讨论了关系数据模型和关系语言、数据库设计过程、关系数据库理论、数据库应用设计和开发、数据存储结构、数据存取技术、查询优化方法、事务处理系统和并发控制、故障恢复技术、数据仓库和数据挖掘...

    客户订购登记数据库设计

    题目:客户订购登记数据库设计 初始条件: 一个公司希望为其客户订购行为建立一个数据库。一个消费者可以有一个或多个订单,每个订单可以有一种或多种商品。每个订单有一张发票,可以通过多种方式来支付,例如支票、...

Global site tag (gtag.js) - Google Analytics