Som*_*ame 5 mysql sql database translation internationalization
我将开始研究中型应用程序,我正在计划它的数据库设计.我不确定的一件事是这个.我将有许多表需要国际化,例如:"membership_options,gender_options,language_options等"
这些表中的每一个都将共享常见的i18n字段,例如:"title,alternative_title,short_description,description"
在您看来哪种方式最好?有一个i18n表,每个表需要它们具有相同的字段吗?
或做类似的事情:
Membership table Gender table
---------------- --------------
id | created_at id | created_at
1 - 22.03.2001 1 - 14.08.2002
2 - 22.03.2001 2 - 14.08.2002
General translation table
-------------------------
record_id | table_name | string_name | alternative_title| .... |id_language
1 - membership regular null 1 (english)
1 - membership normale null 2 (italian)
1 - gender man null 1(english)
1 -gender uomo null 2(italian)
Run Code Online (Sandbox Code Playgroud)
这会避免我重复这样的事情:
membership_translation table
-----------------------------
membership_id | name | alternative_title | id_lang
1 regular null 1
1 normale null 2
gender_translation table
-----------------------------
gender_id | name | alternative_title | id_lang
1 man null 1
1 uomo null 2
Run Code Online (Sandbox Code Playgroud)
等等,所以我可能会减少数据库表的数量,但我不确定性能.我不是一个数据库设计师,所以请告诉我.
我见过的最常见的方法是使用两个表,membership其中membership_ml一个存储基值,一个 ml 表存储本地化字符串。这与您的第二个选项类似。我看到的大多数系统都是这样制作的,因为它们从一开始就没有考虑国际化,所以额外的 _ml 表是后来“添加”的。
我认为更好的选择与您的第一个选择类似,但略有不同。您将有一个用于存储所有翻译的中央表,但您将使用令牌和中央“内容”表来存储所有翻译,而不是将表名称和字段名称放在那里。这样,如果您愿意,您也可以在基表中的标记和内容表中的翻译之间强制执行某种 RI。
事实上,我不久前问过一个关于这件事的问题,所以你可以看看它以获取更多信息(而不是在此处重新粘贴架构示例)。