设计数据库以支持多语言
设计数据库以支持多语言
我正在尝试将多语言支持引入应用程序的后端,并试图找出一种有效实现此功能的策略,以适应当前的架构。\n目前,我有多个表,其中包含标准的英文值。\n我的想法是,在每个包含英文值的表中,都包含一个与翻译表中的一个“语言”和多个“语言值”相关联的外键。\n例如:\n表1\n
数值 | Lang_ID "This is a sentence" | 1 "This is also a sentence" | 2 "Translate this" | 3
\n表2\n
数值 | Lang_ID "This is a sentence from another table" | 4 "This table is different from table-1" | 5
\n语言表\n
Lang_ID | Lang_Code | 值 1 | "ZHO" | "这是一句话" 1 | "SPA" | "esta es una frase" 2 | "FRA" | "c'est aussi une phrase" 3 | "SPA" | "traduce esto" 4 | "FRA" | "ceci est une phrase d'un autre tableau" ....
\n我的想法是,只需通过WHERE Lang_ID=? AND Lang_Code=?查询语言表,即可获取特定值的翻译。\n我有几个问题想问一下:\n1)这是一个好的做法吗?\n2)如何在多个表上生成尚不存在的外键并保持每个外键的唯一性(以避免两个不同文本值的翻译落在相同的Lang_ID下)?
设计数据库以支持多语言
在设计数据库以支持多语言时,我们需要解决以下两个问题:原因和解决方法。
问题的原因:
1. 需要存储多语言翻译的字符串值。
2. 需要为每个字符串值生成唯一的标识符。
解决方法:
1. 创建一个单独的表用于存储翻译。
2. 使用序列生成唯一的标识符。
首先,我们可以使用一个单独的表来存储翻译。这样做的好处是可以将翻译与原始字符串值分开存储,使得数据库的结构更清晰。即使默认的英文值也可以存储在翻译表中。
其次,我们可以将语言代码存储在一个单独的表中。这样做的好处是可以方便地管理语言代码,但在实际应用中可能没有特别需要使用语言代码的情况。因此,建议将语言代码保留在原始表中。
对于唯一标识符的生成,可以使用序列来实现。以下是一个示例代码,可以在插入新的翻译字段时使用:
create sequence sequence_name start 1 increment 1 NO MAXVALUE CACHE 1;
在插入新的翻译字段时,可以使用`next_val('sequence_name')`来生成唯一的键。每次调用`next_val('sequence_name')`时,都会返回下一个可用的整数作为该字符串字段的键。第一次调用将返回1,第二次调用将返回2,依此类推。
总之,为了支持多语言,我们可以使用一个单独的表来存储翻译,使用序列来生成唯一的标识符。这样可以更好地组织数据库结构,并且方便地管理多语言翻译。