Mysql 如何在数据库中正确保存语言技能级别

Mysql 如何在数据库中正确保存语言技能级别,mysql,Mysql,我想我是在你们许多人以前遇到的问题之前。我有一个登记表,用户可以选择地球上的任何语言,然后从选择框中选择相应语言的技能水平 例如: Language1: German Skill: Fluent Language2: English Skill: Basic 我在想,在MySQL数据库中存储这些值的最佳方式是什么 我想到了两种方法。 第一种方法:为每种语言创建一列,并为其指定技能值 -------------------------------------------------- | Use

我想我是在你们许多人以前遇到的问题之前。我有一个登记表,用户可以选择地球上的任何语言,然后从选择框中选择相应语言的技能水平

例如:

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 |
+--------+------------+--------------+
以及另一个将用户链接到语言的表:

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中表示这种关系的标准化方法。所有数据都很容易搜索,如果添加语言,则无需更改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   |
+--------------+-----------+

我在这里所做的叫做。我建议您阅读相关内容,它可能会帮助您设计更多的数据库。

但《从商业角度看不好》用例中的第二个。如果您想找到拥有4种英语或任何语言的用户,您会怎么做?@Amar我100%同意您的意见,我的两个示例在您拥有多种语言时都不是最好的。我只是不知道我还能怎么做我同意Amar的观点,如果你使用这种数组来表示一列,那么你的SQL查询会变得更加困难(使用MySQL
比直接从独立列中获取数据要困难得多),除非您计划总是依靠手动获取和搜索该数组……这似乎是一个一致的解决方案,它解决了为每种语言创建独立列的问题。语言表甚至可以按语言代码和语言“名称”进行划分。还有第三个表映射技能等级(ID)和技能“名称”和/或描述。感谢回答@Beat,这是比我现在介绍的任何解决方案更好的解决方案。我只是想问一下,在现场呈现之前,大型if/else语句是否不会有问题。或者它应该是什么样子?我可以想象userID是外键,所以这是我如何将它与表“users”配对的,但我如何将它与表“languages”配对。我可以请您创建一个简单的MYSQL语句示例,其中有3个表:users、languages、user_languages?@Andurit您的user_languages表是Beat的第二个表,其中有一个FKey到user表(userID)另一个指向语言表(languageid)。您可以通过创建这些表并通过导出来获得create SQL语句(如果您使用的是本地环境),实际上这样做更快,而且您不必检查语法)。@Beat很高兴它有用:)@Andurit我已经包括了一个示例QueryTanks Beat,答案标记为正确。我感谢你的帮助