【问题标题】:best practice for foreign key relationships外键关系的最佳实践
【发布时间】:2015-05-28 18:59:50
【问题描述】:

从上述两个创建外键的最佳实践是: 可能性1:

table1 : 用户(id,name,password) 表2:考试(ID,姓名) 表 3:user_exam(is,user_id,exam_id)

可能性 2:

table1 : 考试(id,name) table2 : 用户(id,name,password,exam_id)

【问题讨论】:

  • 我猜是第一个,因为我觉得一个用户可能与多个考试相关联..用户有_many考试,在这种情况下,你不能处理第二个..如果不是这样这种情况下,那么你可以有第二张表,其中用户 has_one 考试。

标签: mysql database foreign-keys foreign-key-relationship


【解决方案1】:

根据您正在建模的内容,我猜您在考试和用户之间存在多对多关系。换句话说,你可以有没有用户的考试和没有考试的用户。在这种情况下,模型 2 根本不起作用。

在模型 2 中,每个用户只能获得一个 id,否则每次添加考试时您都必须拥有多个用户记录,这会增加数据完整性问题的可能性,尤其是因为存在密码。甚至不要考虑使用模型 2,除非您能保证永远不需要超过一次考试。

根据您所讨论的考试类型,user_exams 表可能应该包含附加信息,例如日期。您可能还需要什么取决于您正在建模的数据的含义。

【讨论】:

    【解决方案2】:

    您的问题更像是一个基于意见的问题,但据我所知,外键应该在联结表中。所以可能性1是使用外键的理想方法。

    【讨论】:

    • 感谢 Rahul :) 我可以知道可能性 1 成为理想方法的原因是什么吗?
    • @priyanka:- 1. 当您只想从两个表中获取 id(可能在某些应用程序中)时,表(user_exam)可能很有用。 2. 如果用户有很多考试,如 argentum 所说,这将很有用。 3. 参照完整性应在尽可能低的级别上处理。
    • @priyankachordiya:- 如果我的假设没有错,那么这个问题与您所问的stackoverflow.com/questions/29217781/… 密切相关。因此,对可能性 1 的最佳解释是您的问题本身;)
    • 因为您不想为用户的所有考试提供密码。否则,您将有数据冗余,例如将重复相同的密码,然后为用户获取密码将使用 distinct 或 group by。用户名也会出现同样的问题
    • 外键通常不是联结表的 necarray(并且可能不会比它们更频繁)。这取决于数据的含义和数据的关系。在这种情况下,它可能是多对多的关系,而连接表是正确的选择。但是,例如 OrderDetails 到 Order 表的 pk/FK 是经典的一对多,不需要联结表。
    猜你喜欢
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 2012-05-19
    • 2014-07-05
    • 2012-09-03
    • 1970-01-01
    相关资源
    最近更新 更多