作者 | Antonello Zanini
译者 | 李睿
策划 | 武穆
让数以百万计的用户使用自己开发的应用程序是每个开发人员的梦想。如果让世界各地的用户都能使用其开发的应用程序,那么实现这一目标将变得更加容易。由于并非所有用户都精通英语或开发人员的母语,因此需要将其设计为多语言的应用程序。但是如果没有多语言数据库,这是不可能实现的。
设计一个可以轻松扩展到新语言的多语言数据库并不容易。这就是开发人员应该依赖最佳实践的原因。以下将介绍为什么需要多语言数据库、三种出色的多语言数据库设计,以及如何选择最适合的多语言数据库。
下面开始介绍有关多语言数据库设计的知识。
1.为什么需要多语言数据库?
开发人员可能永远不知道他的应用程序将会增长多少,也许他为朋友开发的一个小应用程序有可能成为数百万人使用的国际服务。如果希望开发的产品能够在国际上得以推广,则需要对其进行多语言设计,以便可以轻松地使其适应不同的文化和市场。这就是国际化的意义所在。
建立一个为国际化做好准备的数据库意味着设计一个可以存储多语言数据的数据库。换句话说,后端应该能够提供多种语言的数据。为此,后端应连接并从多语言数据库中检索这些数据。
需要注意的是,让用户可以在多种语言之间切换是一个很好的功能。这对于多语种或非母语人士特别有用。因此,即使开发的项目很小并且针对本地市场,开发人员也应该考虑使用多语言数据库。毕竟,开发人员无法提前知道其项目将取得多大成功以及哪些用户将使用它。以下介绍为什么开发人员选择正确的多语言数据库设计是至关重要的。
2.为什么应该精心设计多语言数据库
就时间和精力而言,更改数据库是一项非常昂贵的操作,因为它会引发连锁反应。修改数据库的结构涉及更改连接到它的后端。这可能还需要开发人员相应地调整依赖这些后端的前端。总之,更改数据库结构不是没有后果的操作。因此,开发人员应该设计一个可以轻松扩展且无需频繁更改的数据库。
可以想象,设计多语言数据库有多种方法,每种解决方案都有其优缺点。考虑到数据库结构对应用程序的重要性,开发人员必须精心设计多语言数据库。这就是开发人员不应该从头开始而是依赖最佳实践的原因。
以下介绍一些基于最佳实践的多语言设计。
3.多语言数据库的三个设计
作为一名为世界各地的初创公司工作的全栈web开发人员,让我们更深入地探讨三种多语言设计的优缺点。
(1)列方法
在这种方法中,多语言表中的每个字段的列数等于数据库支持的语言数。
具体来说,这是列名模板的样子:columnName_languageCode
优点:
- 简单:易于实施。
- 快速:不涉及JOIN或慢查询。
- 易于处理未翻译的字段:如果缺少某个字段的翻译,可以直接使用。例如,COALESCE(name_it, name_en)→如果name_it不为NULL,则返回name_it,否则返回name_en默认值。
缺点:
- 难以维护:添加新语言需要更新数据库中所有的多语言表。这也意味着开发人员需要相应地更改其ORM映射。
- 不可扩展:表中的列数随着应用程序支持的语言数量而增长。
- 复杂的SELECT条件:忘记SELECT*。需要在SELECT子句中指定每一列。
(2)行方法
在这种方法中,每种语言都有一行。识别多语言实体的关键是以下复合主键: <id, languageCode>
优点:
- 简单:易于实施。
- 快速:检索翻译的内容只需要languageCode上的WHERE条件。
缺点:
- 复合主键更加复杂:使用复合主键使识别元素和JOIN查询更加复杂。
- 重复内容:为简化起见,非翻译列通常存储保存在默认语言行列中的相同内容。这意味着开发人员将在多语言表格中拥有大量重复的内容。
(3)翻译表法
在这种方法中,多语言表的每一列都是翻译表的外部键。换句话说,每个涉及多语言字段的表都有一个翻译表。
优点:
- 可扩展性:添加新语言不涉及更改数据库结构。
- 支持历史数据:可以使用翻译表来跟踪实体中每个字段的翻译历史。
- 集中式:一个实体的所有翻译都存储在一个地方。
缺点:
- 查询复杂:查询变得更加复杂,因为与多语言实体相关的信息分布在两个表中。
- 慢查询:检索与实体关联的所有信息需要与列数一样多的JOIN。考虑到JOIN对性能的负担,这很容易成为问题。
- 重复表:它增加了数据库表的大小。另外,需要两个表来定义每个多语言实体。
4.什么是最适合的多语言数据库设计?
每种多语言数据库设计都有一定优点和缺点。这意味着没有万能的方法。开发人员必须根据自己的要求、需要和目标仔细选择。我个人在不同的项目中使用了这三种方法,并从中吸取了经验教训。
当处理大数据时,开发人员可能在连接查询或重复内容时不堪重负,尤其是从拥有包含数百万行的表的数据库的角度来看,列方法特别有用。虽然列方法并不是最具可扩展性的解决方案,但它是唯一可行的大数据设计。
另一方面,当企业能够得到在当地市场运营的分支机构的支持时,行方法很有用。在这种情况下,内容的重复甚至可能是一个优势。
最后,如果开发人员正在寻找一个优雅且可扩展的解决方案,并且不介意性能缺陷,那么翻译表法是正确的设计,因为翻译表法更适合数据不会暴涨的项目。
5.结论
设计一个可以存储多语言数据的数据库,对于帮助开发人员在国际上扩展业务至关重要。此外,多语言数据的数据库还允许非母语人士使用其应用程序。更改数据库是一项复杂且耗时的操作,对应用程序架构的影响不可忽视。这就是开发人员应该从一开始就将数据库设计为多语言的原因。
文章中分析了设计多语言数据库的三种不同方法,研究了它们的优缺点,并详细介绍了最适合的方法。
原文链接:https://dzone.com/articles/designing-a-multi-language-database