这对 table 来说是一个好的设计吗?

Is this a good design for a table?

每个 user/person 人都可以掌握一种或多种语言。

我能想到的就是table喜欢

+----------+------+-----+------------+-----+-----+-----+-------+
| 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 列,那么多列是否正常?有些东西告诉我这是错误的方法。

非常感谢你,对不起我的英语!

我建议您创建三个 table。

一个 table 包含此人的信息,如姓名等

第二个 table 包含两列 LanguageId 和语言名称。

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

第三个table 包含Id、PersonId、LanguageID。在这个table你可以加入上面两个table的记录。

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

支持我回答的理由:

  • 将来如果您想在 table 中添加任何新语言,那么它 将其添加到主要 table.
  • 中会更容易
  • 您可以轻松加入两个 table 并获得结果

我们可以对 Rahul Tripathi 的回复做一点改进,就是删除 "Known" 列。对于这种情况,您只需要两个 table。一个包含此人知道的 PersonId 和 LanguageId。第二个 table 仅适用于语言。

加入两个table,您就知道一个人会说什么语言。例如,如果您需要了解已知语言的列表,您可以执行以下操作:

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