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,答案标记为正确。我感谢你的帮助