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

And*_*rit 4 mysql

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

所以,例如:

Language1: German
Skill: Fluent
Language2: English
Skill: Basic
Run Code Online (Sandbox Code Playgroud)

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

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

--------------------------------------------------
| UserID |   language_en    |  language_ge       |
--------------------------------------------------
|   22   |       1          |         4          |
--------------------------------------------------
|   23   |       3          |         4          |
--------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

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

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

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

----------------------------------
| UserID |       languages       |  
----------------------------------
|   22   | "ge"=>"4", "en"=>"1"  |   
----------------------------------
Run Code Online (Sandbox Code Playgroud)

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

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

非常感谢.

Bea*_*eat 9

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

Table: Language
+------------+-------------------+--------------+
| LanguageID | LanguageNameShort | LanguageName |
+------------+-------------------+--------------+
|          1 | en                | English      |
|          2 | de                | German       |
+------------+-------------------+--------------+
Run Code Online (Sandbox Code Playgroud)

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

Table: LanguageLink
+--------+------------+--------------+
| UserID | LanguageID | SkillLevelID |
+--------+------------+--------------+
|     22 |          1 |            1 |
|     22 |          2 |            4 |
|     23 |          1 |            3 |
|     23 |          2 |            4 |
+--------+------------+--------------+
Run Code Online (Sandbox Code Playgroud)

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

要呈现用户的语言,您可以使用这样的查询.它将为您提供用户说话的每个语言行:

SELECT
    LanguageLink.UserID,
    LanguageLink.SkillLevelID,
    Language.LanguageNameShort
FROM
    LanguageLink,
    Language
WHERE
    LanguageLink.UserID = 22
    AND LanguageLink.LanguageID = Language.LanguageID
Run Code Online (Sandbox Code Playgroud)

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

Table: Skill
+--------------+-----------+
| SkillLevelID | SkillName |
+--------------+-----------+
|            1 | bad       |
|            2 | mediocre  |
|            3 | good      |
|            4 | perfect   |
+--------------+-----------+
Run Code Online (Sandbox Code Playgroud)

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