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



我想我遇到了你们很多人以前遇到过的问题。我有一个注册表格,用户可以选择任何语言的星球,然后选择他的技能水平为各自的语言从选择框

例如:

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

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

我想到了两种方法。第一种方法:为每种语言创建一列,并为其分配技能值。
--------------------------------------------------
| UserID |   language_en    |  language_ge       |
--------------------------------------------------
|   22   |       1          |         4          |
--------------------------------------------------
|   23   |       3          |         4          |
--------------------------------------------------

所以语言总是列的名称,数字代表技能水平(1)。基本2。平均……)

我相信这是一个很好的方式来处理这些事情,它也相当快。当有50种或更多的语言时,问题就开始了。如果用户有一定的语言技能,脚本总是要检查50列,这听起来不像是一个好主意。

第二种方法:在表的某一列中插入一个数组。表看起来像这样:

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

这样,ID为22的用户的德语技能等级为4,英语技能等级为1。这很好,因为我们不需要检查50个额外的列(甚至更多),但在我看来,这不是正确的方法。我们必须解析大量结果并找到一个用户,例如,德语为1级,西班牙语为2级,而不需要查找英语技能水平-这将花费服务器更长的时间,当更大的数据出现时,我们就麻烦了。

我敢打赌你们很多人都经历过这种问题。请问,有人能告诉我如何解决这个问题吗?

我建议你有一个单独的表,所有的语言:

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

我在这里所做的称为数据库规范化。我建议你阅读一下,它可以帮助你设计更多的数据库。

最新更新