我想我遇到了你们很多人以前遇到过的问题。我有一个注册表格,用户可以选择任何语言的星球,然后选择他的技能水平为各自的语言从选择框。
例如:
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 |
+--------+------------+--------------+
这是在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 |
+--------------+-----------+
我在这里所做的称为数据库规范化。我建议你阅读一下,它可以帮助你设计更多的数据库。