这是一个很好的桌子设计吗?

时间:2015-04-18 17:29:10

标签: database database-design database-schema

每个用户/个人都可以知道一种或多种语言。

我能想到的只是一张像

这样的表格
+----------+------+-----+------------+-----+-----+-----+-------+
| PersonID | Java | PHP | Javascript | C++ |  C  | CSS | HTML  |
+----------+------+-----+------------+-----+-----+-----+-------+
|        1 | Yes  | Yes | No         | Yes | No  | Yes | No    |
|        2 | No   | Yes | Yes        | No  | Yes | No  | No    |
|        3 | Yes  | No  | Yes        | Yes | Yes | Yes | No    |
+----------+------+-----+------------+-----+-----+-----+-------+

考虑到我所有语言都需要至少100列,拥有那么多列是正常的吗?有些东西告诉我这是错误的方法。

非常感谢,对我的英语感到抱歉!

2 个答案:

答案 0 :(得分:2)

我建议你创建三个表。

一个表包含人物的信息,如他的姓名等。

第二个表包含两列LanguageId和Language name。

+------------+-----------+
| LanguageID | Name      |
+------------+-----------+
| 1          | Javascript| 
| 2          | C         | 
| 3          | C++       | 
+------------+-----------+

第三个表包含Id,PersonId,LanguageID。在此表中,您可以加入上述两个表记录。

+---+----------+------------+
|ID | PersonID | LanguageID | 
+---+----------+------------+
|1  |        1 | 1          | 
|2  |        2 | 2          | 
|3  |        3 | 3          | 
+---+----------+------------+

支持我答案的理由:

  • 以后如果你想在你的表中添加任何新语言,那么它 会更容易在主表中添加。
  • 您可以轻松加入这两个表并获得结果

答案 1 :(得分:1)

我们可以对Rahul Tripathi的反应做一点改进就是删除“已知”专栏。在这种情况下,您只需要两个表。一个包含PersonId和LanguageId的人知道。第二个表仅适用于语言。

您可以通过加入两个表来了解一个人所知道的语言。例如,如果您需要知道可以执行的已知语言列表:

SELECT p.PersonId, l.Name
FROM Person p INNER JOIN Language l ON (p.LanguageId = l.LanguageId)
WHERE (p.PersonId = theIdYouNeedToKnow)