我认为我之前遇到过很多人的问题。我有一个注册表,用户可以选择该行星的任何语言,然后从选择框中选择相应语言的技能等级。
所以,例如:
Language1: German
Skill: Fluent
Language2: English
Skill: Basic
我在想什么是将这些值存储在MySQL数据库中的最佳方法。
我想到了两种方法。 第一种方法:为每种语言创建一个列并为其分配技能值。--------------------------------------------------
| UserID | language_en | language_ge |
--------------------------------------------------
| 22 | 1 | 4 |
--------------------------------------------------
| 23 | 3 | 4 |
--------------------------------------------------
因此语言始终是列的名称,数字代表技能级别(1. Basic,2。Average ...)
我相信这是处理这些事情的好方法,而且速度也很快。当有50种或更多语言时,问题就开始了。如果用户具有该语言的任何技能,那么制作50列并不是一个好主意,其中脚本总是必须检查它们。
第二种方式:在一个表的列中插入一个数组。该表将如下所示:
----------------------------------
| UserID | languages |
----------------------------------
| 22 | "ge"=>"4", "en"=>"1" |
----------------------------------
这样,ID为22的用户具有德国技能等级4和英语技能等级1。这样很好,因为我们不需要检查50个额外的列(甚至更多),但无论如何它都不是我眼中的正确方法。 我们必须解析很多结果,并找到一个用户,例如,德国的1级和西班牙语的2级,而不是寻找英语技能水平 - 服务器需要更长的时间,当更大的数据出现时我们是陷入困境。
我打赌你们很多人都遇到过这种问题。拜托,有人可以告诉我如何解决这个问题吗?
非常感谢。
答案 0 :(得分:9)
我建议您使用所有语言单独的表格:
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 |
+--------------+-----------+
我在这里所做的是Database normalization。我建议阅读它,它可以帮助你设计更多的数据库。