如何存储大部分空数据?

时间:2017-06-06 12:59:49

标签: php mysql performance translation

我想建立一个系统,允许每个帖子提供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个。什么是有效的存储方式?

1 个答案:

答案 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"