【问题标题】:Is this a good design for a table?这是一个很好的桌子设计吗?
【发布时间】:2015-04-18 17:29:09
【问题描述】:

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

我能想到的只是一张桌子

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

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

【问题讨论】:

    标签: database database-design database-schema


    【解决方案1】:

    我建议你创建三个表。

    一个表包含这个人的信息,比如他的名字等。

    第二个表包含两列 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          | 
    +---+----------+------------+
    

    支持我的回答的理由:

    • 以后如果您想在表中添加任何新语言,那么它 将其添加到主表中会更容易。
    • 您可以轻松地将两个表连接起来并得到结果

    【讨论】:

    • 但是如果 PersonID 1 知道 LanguageID 1 和 LanguageID 2 怎么办?你会如何在第一个表中表明这一点?
    • @anonymous:- 您可以创建一个 Person 表,您可以在其中添加人员的详细信息。然后在您的表中,您可以连接两个表。
    • @anonymous:- 更新了我的答案。希望对您有所帮助。
    • 这很有帮助,但有一件事我无法真正理解。在第三张表中,我如何表明一个人知道语言 1 和语言 2?会不会是这样,重复人ID? link
    • 太棒了!非常感谢:D
    【解决方案2】:

    我们可以对 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)
    

    【讨论】:

    • 非常清楚的一点。感谢您在我的回答中指出该缺陷。也更新了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    • 2012-06-27
    • 2015-10-30
    • 2011-09-13
    • 1970-01-01
    相关资源
    最近更新 更多