多语言系统的数据库设计

之前做的项目涉及到中国大陆和纽伦新港的用户使用,也就需要做成一个多语言的系统,现在总结下其中一些经验和思考。

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

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

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

比如我们有一个客户表,记录了客户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是该对象中多语的属性个数.

网站多语言设计的一些思路。框架实现多国语言。 介绍一个PHP 多国语框架 v5.1:https://lang-php.com/?lang=zh-CN   有时候做网站的时候需要考虑多语言设计,比如外贸网站。即便是简体中文和繁体中文网站设计也不是简单的繁简转换就行的。 多语言网站面临的设计问题: 1、多语言语法问题 简体中文和繁体中文是现代汉语并存的两种书面形式。它们在语音、词汇、语法等方面都有明显差异,给大陆和港澳台地区的交流和沟通... 阅读详情

相关推荐

多语言开发方案设计

游戏项目后期需要繁体和其他语言版本,之前所有文字都编辑在编辑器里的问题就暴露了出来,多语言的整理和自动化显得比较重要。 方案如下: 1. excel存储多语言文字内容 excel的格式如下 2. python脚本处理excel python自动生成多语言头文件,以及具体使用的文本存储形式(xml, key-value存储, sql存储之类), 具体存储单个语言还是多个语言

code_monkey的专栏 1648

6个技巧掌握多语言设计

以通知栏为例,通常通知栏内承载着告知用户的重要信息和提醒,在切换其他语言环境后,可能会触发多行展示,一方面信息过多可读性不佳,另一方面由于其组件本身悬停在页面上的特性,占用单屏过多的高度,使得屏幕的使用率不高。文本扩展导致的布局问题,是多语言设计中最常见的问题。在中文环境的设计流程中,往往业务文案会结合实际设计再做调整,以便能达到最理想的排版和布局效果,但布局多种语言后,由于译文长度不可预知,往往需要通过换行来保证文本的完整性,而最直接的方法就是预留足够的空间(通常建议多预留一行文本高度)去适应译文。

winkexin的博客 1086

减法平均优化器(SABO)算法详解:从数学原理到工程应用

减法平均优化器(SABO)是一种基于数学概念的新型元启发式优化算法,由Trojanovský和Dehghani于2023年提出。该算法通过v-减法运算和平均值计算实现搜索优化,核心创新是采用目标函数值差异符号引导搜索方向。SABO具有参数少、结构简单、收敛快等特点,在高维复杂问题中表现优异。算法通过种群平均值保持多样性,利用符号函数确保搜索方向改进,自然平衡探索与开发。MATLAB实现显示其计算复杂度为O(N²·D),与主流群体智能算法相当。SABO不依赖生物或物理隐喻,数学基础坚实,在工程优化和机器学习领

qq_42212808的博客 131

多语言系统的实现思路

首先在语言档案表里,建立多语言档案,在用户登录界面,添加 语言选择框,让用户在登录界面时,就选择一种默认语言。用户登录后,除了业务数据外,系统菜单、按钮、单据标题、提示语都按默认语言显示。考虑到PC端、PAD端、PDA端等多个终端的场景,且PAD、PDA有可能进行离线作业,所以提示语的多语不能存在数据库服务器里,需要以资源文件方式随安装包进行安装。比如,今年只做英国的业务,只需要使用英文,但明年需要做法国的业务需要使用法语。业务单据的查询和打印界面,默认显示两种语言,其它语言对应的业务数据通过弹窗显示。

niu_mo_wang的专栏 1614

mysql多语言运营设计_多语言系统数据库设计

之前做的项目涉及到中国大陆和纽伦新港的用户使用,也就需要做成一个多语言系统,现在总结下其中一些经验和思考。首先我们需要确认我们要做的系统多语言到底是要做多少种语言,以后会不会要求增加更多的语言。比如我们做一个给中国大陆和纽伦新港使用的系统,可以确定的语言就是简体中文、繁体中文和英语,而且可以确定以后也不会增加语言。确定以后是否需要增加语言这一点很重要,决定了我们在数据库设计时,是否需要考虑多语...

weixin_33573700的博客 534

MySQL与Hunyuan-MT 7B:多语言内容管理系统数据库设计

本文介绍了如何在星图GPU平台上自动化部署Hunyuan-MT 7B 全能翻译镜像,构建高性能多语言内容管理系统。通过优化MySQL数据库设计与缓存策略,该镜像可高效支撑跨境电商等场景下的实时多语言内容翻译与检索,显著提升国际化内容管理效率。

weixin_35696112的博客 252

多语言系统设计与实现原理

多语言(i18n)设计中,需满足以下需求:。动态适配:根据用户语言环境返回对应语言的文本。灵活性:支持静态文本(如按钮标签)和动态内容(如商品名称)。易维护性:语言资源可扩展、可集中管理。性能优化:减少实时解析开销,提升响应速度。数据存储:在数据库字段中存储多语言内容的JSON结构。动态解析:根据用户语言标识提取对应值。商品多语言名称、描述。用户生成内容(如评论、动态)。 4. 优缺点 优点:适合频繁更新的动态内容,支持嵌套结构。缺点:需手动解析JSON,性能较低。数据库设计:创建字典表(如

thankgoodneww的博客 1571

多语言多货币跨境外贸网站商品库系统搭建(java开源)

通过国际化(i18n)来支持多语言,将界面文字和商品信息等提取到资源文件中,根据用户的语言显示对应的文字。- 通过货币转换接口或第三方支付接口来支持多货币,根据用户的货币类型进行相应的货币转换和显示。- 考虑多语言和多货币的逻辑,例如根据用户的语言和货币显示不同的商品信息和价格。- 确定商品库的数据结构和功能,例如商品分类、商品属性、商品图片等。- 确定网站的语言和货币种类,例如英文和中文以及美元和人民币。- 设计商品库的数据库结构,包括商品表、分类表、属性表等。- 选择适合系统需求的开源框架。

大东-byi8761的博客 288

多国语言数据库设计

分类: 数据库级别表级别字段级别 数据库级别,不同语言使用不同的数据库数据库中通常包含许多并不涉及到多语言的表,会出现冗余表。 着重介绍表和字段级别: 字段级别(ID, Description, Description_En, Description_Fr...) ID为主键 优点: 操作简单,一条记录搞定 缺点: 不利于扩展,如添加新语言,需要添加字段不同语言加载不同字段 ...

weixin_34389926的博客 691

MultipleLanguageSystem多语言系统设计

因为项目需要,设计多语言系统,需求是能够实时切换语言类型(例:CN,EN) 在经过思考以后,对原来的方案做了一些改进 一。原来的多语言数据保存为二进制文件,编剧用的xlsx,类似: 但是这样有他不好的地方:就是xlsx表在一个时间内只能一个人操作,如果多人同时操作,因为他是二进制文件,上传SVN时会产生冲突,这时候就很尴尬, 面临着要么自己白干要么别人白干的艰难选择。 所以后来做...

qq_23490317的博客 947

聊聊多语言商城系统的产品设计思路

现在生意全球化,企业在做外贸出海的时候,往往都会去选择跨境平台进行交易,不过也有大部分的企业采用建设独立的多语言商城系统,并以此进行贸易活动。那么多语言商城系统的产品设计思路是怎样呢?今天商淘云小编与您分享。 1.做好语言包机制 在开发多语言商城的开始,首先就要想到,多语言商城的语言有几种,要怎样去做进去。采用语言包的形式可以很好的,用户进入站点选择默认语言(网站主语言),并根据用户需要提供多种语言切换,我们不能依靠做好的几个语言定义已实现的语种,还需要考虑后期管理维护等问题,做好语言包机制,.

商淘云电商系统 1135

如何设计多语言建站系统

生意全球化,语言是横跨在跨境电商用户与企业中间的一个比较大的槛,需要做好适应不同国家和地区的语言。 1、做好语言包机制,在切换语言的时候使用不同的语言包,快速适应风格。 2、做好数据切换,在切换到不同的语言环境下,用到的主要影响用户体验的地方,要能在后台设置; 3、不要机翻,要有确认机制,比如一些驰名商标机翻可以识别,但一般的品牌就容易翻译错误了。 4、前后台多语言切换,以适应不同语言的运营人员需要。 要适应不同的国家和地区,做好多语言建站机制是必要的,就看多语言切换机制如何设计的..

商淘云电商系统 1057

2019-2025年300个城市-人口迁徙规模数据.xlsx

2019-2025年300个城市-人口迁徙规模数据.xlsx

上一篇: Git 基础
下一篇: 设计模式 笔记 观察者模式
weixin_33882443
博客等级 码龄11年 4923粉丝 124原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值