2017-06-06 44 views
1

我想建立一个允许每个帖子有200个不同翻译的系统。然而,大多数翻译将不存在,所以会有很多空的数据集。如果我将每种语言(包括空白语言)保存为特定列,那么它的性能和存储量会达到多少? I.E.如何存储大部分空数据?

English | Arabic | Mandarin | Russian | French   | German 

Potato |  |   |   | Pomme de Terre | 
Orange |  |   |   | Orange   | 
Peach |  |   |   |    | 

我将通过整个列表不循环,很多时候,我会使用一个会话变量或usersetting,然后直接从该列加载如果它存在,也可能降低为默认语言,也许以后那一个完整的搜索。

if (exists(french)) 
    {echo french} 
else {if(exists(english)) 
      {echo english}} 
    else {echo links to non-null language} 
    } 

我会假设,如果我告诉服务器要去哪个列,处理方面的开销可以忽略不计?我还假设一个空单元在存储方面可以忽略不计?然而,我不知道,它可能是一个巨大的错误。

我想这样工作的原因是我可以分配语言代码,而不是每个安装的实例具有不同的顺序(例如,英语|法语|德语|普通话与英语|普通话|德语|法语)。

为了防止XY-问题,这里有一个更具全球性的表述: 我想建立一个系统,允许许多语言,但我相信在大多数情况下只有1个或两个被使用。什么是有效的存储方式?

回答

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,你可以看一下语言和文字IDS第一,或使用更高级的查询):

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" 
+1

这是一个多方面的:使用3台一对多的关系。可以通过使用'标准'双字母国家代码或奥地利德语的'de_AT'等“语言环境”来简化。 –