如何在数据库中正确保存语言技能水平

时间:2015-05-25 09:12:45

标签: mysql

我认为我之前遇到过很多人的问题。我有一个注册表,用户可以选择该行星的任何语言,然后从选择框中选择相应语言的技能等级。

所以,例如:

Language1: German
Skill: Fluent
Language2: English
Skill: Basic

我在想什么是将这些值存储在MySQL数据库中的最佳方法。

我想到了两种方法。 第一种方法:为每种语言创建一个列并为其分配技能值。

--------------------------------------------------
| UserID |   language_en    |  language_ge       |
--------------------------------------------------
|   22   |       1          |         4          |
--------------------------------------------------
|   23   |       3          |         4          |
--------------------------------------------------

因此语言始终是列的名称,数字代表技能级别(1. Basic,2。Average ...)

我相信这是处理这些事情的好方法,而且速度也很快。当有50种或更多语言时,问题就开始了。如果用户具有该语言的任何技能,那么制作50列并不是一个好主意,其中脚本总是必须检查它们。

第二种方式:在一个表的列中插入一个数组。该表将如下所示:

----------------------------------
| UserID |       languages       |  
----------------------------------
|   22   | "ge"=>"4", "en"=>"1"  |   
----------------------------------

这样,ID为22的用户具有德国技能等级4和英语技能等级1。这样很好,因为我们不需要检查50个额外的列(甚至更多),但无论如何它都不是我眼中的正确方法。 我们必须解析很多结果,并找到一个用户,例如,德国的1级和西班牙语的2级,而不是寻找英语技能水平 - 服务器需要更长的时间,当更大的数据出现时我们是陷入困境。

我打赌你们很多人都遇到过这种问题。拜托,有人可以告诉我如何解决这个问题吗?

非常感谢。

1 个答案:

答案 0 :(得分:9)

我建议您使用所有语言单独的表格:

Table: Language
+------------+-------------------+--------------+
| LanguageID | LanguageNameShort | LanguageName |
+------------+-------------------+--------------+
|          1 | en                | English      |
|          2 | de                | German       |
+------------+-------------------+--------------+

另一个将用户链接到语言的表:

Table: LanguageLink
+--------+------------+--------------+
| UserID | LanguageID | SkillLevelID |
+--------+------------+--------------+
|     22 |          1 |            1 |
|     22 |          2 |            4 |
|     23 |          1 |            3 |
|     23 |          2 |            4 |
+--------+------------+--------------+

这是表示DB中这种关系的规范化方式。所有数据都易于搜索,如果添加语言,则无需更改数据库方案。

要呈现用户的语言,您可以使用类似的查询。它将为用户说话的每个语言提供一行:

SELECT
    LanguageLink.UserID,
    LanguageLink.SkillLevelID,
    Language.LanguageNameShort
FROM
    LanguageLink,
    Language
WHERE
    LanguageLink.UserID = 22
    AND LanguageLink.LanguageID = Language.LanguageID

如果你想更进一步,你可以创建另一个技能水平的表:

Table: Skill
+--------------+-----------+
| SkillLevelID | SkillName |
+--------------+-----------+
|            1 | bad       |
|            2 | mediocre  |
|            3 | good      |
|            4 | perfect   |
+--------------+-----------+

我在这里所做的是Database normalization。我建议阅读它,它可以帮助你设计更多的数据库。