我想建立一个系统,允许每个帖子提供200种不同的翻译。然而,大多数翻译都不存在,因此存在大量空数据集。如果我将每种语言(包括空语言)保存为特定列,会有多少性能和存储空间?即。
English | Arabic | Mandarin | Russian | French | German
Potato | | | | Pomme de Terre |
Orange | | | | Orange |
Peach | | | | |
我不会经常在整个列表中循环,我会使用会话变量或用户设置,然后直接从该列加载(如果存在),并回退到默认语言,也许在之后完全搜索。
if (exists(french))
{echo french}
else {if(exists(english))
{echo english}}
else {echo links to non-null language}
}
我假设,如果我告诉服务器要去哪个列,处理方面的开销可以忽略不计?我还假设一个空单元在存储方面可以忽略不计?但是我不确定,这可能是一个巨大的错误。
我想要像这样工作的原因是我可以分配语言代码,而不是每个安装的实例都有不同的顺序(例如英语|法语|德语|普通话与英语|普通话|德语|法语) 。
为了防止出现XY问题,这是一个更全面的表述: 我想为许多语言设置允许的系统,但我希望在大多数情况下只使用1或2个。什么是有效的存储方式?
答案 0 :(得分:2)
关键字:关系数据库。
您将需要使用多个表。 假设语言的默认语言是英语,那么你的“单词”表将隐含地包含英语单词。
Words:
Id | Word
1 | Potato
2 | Orange
Languages:
Id | Name
1 | Norwegian
2 | Danish
Translations:
Word | Language | Translated
1 | 1 | Potet
2 | 1 | Oransje
1 | 2 | Kartoffel
2 | 2 | Appelsin
然后你可以这样做(伪sql,你可以先查找语言和单词id,或者使用更高级的查询):
SELECT Translated FROM Translations WHERE Word = (the word id) and Language = (the language id)
这样做的好处是,列出您支持的所有语言,您支持的所有单词以及特定语言的所有翻译单词(或查找语言的所有非翻译单词)非常简单。
将“马铃薯”翻译成“丹麦语”的具体查询如下:
SELECT Translated FROM Translations
JOIN Words ON Words.Id = Translations.Word
JOIN Languages ON Languages.Id = Translations.Language
WHERE
Languages.Name = "Danish" and Words.Word = "Potato"