我想我之前遇到过许多人的问题.我有一个注册表,用户可以选择该行星的任何语言,然后从选择框中选择相应语言的技能等级.
所以,例如:
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级,而不是寻找英语技能水平 - 服务器需要更长的时间,当更大的数据出现时我们是麻烦.
我打赌你们很多人都遇到过这种问题.拜托,有人可以告诉我如何解决这个问题吗?
非常感谢.
我建议你有一个单独的表格,包含所有语言:
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)
我在这里所做的是数据库规范化.我建议阅读它,它可以帮助你设计更多的数据库.