我的问题涉及0到很多关系。例如,如果您有客户表和订单表,并且客户可以有一个或多个订单,而订单可以有零个或一个客户。它可以为零的原因是因为订单是从遗留订单系统导入的,其中客户详细信息未被保留。
我相信有两种选择:
哪种选择最好?
编辑:
我发现了以下帖子,并同意Molf的回答,这是我原来的问题中的选项2:Any example of a necessary nullable foreign key?。
答案 0 :(得分:3)
我不会创建联结表,除非您最初将订单密钥限制为唯一和/或预见关系变为多对多。
使用普通单个FK的简单双表选项中的问题是您是否要在订单行中允许NULL客户FK。当然可以不允许这种情况(由于显而易见的良好的参考完整性原因)并且拥有一个“未知客户”客户,该客户用于所有未知客户的遗留订单。以一种非常好的方式,这可以用显式的东西替换NULL(可以被误解)(对“未知的客户”的引用,一旦真正的客户被创建或识别,它总是可以修复)。
我会强烈考虑这一点,因为人们会希望遗留数据在未来的数据中相对越来越小,并且您希望在典型情况下确保数据中的RI(所有情况都在继续)必须在创建订单时识别客户,同时仍然适应遗留案例(随着时间的推移,数据领域的重要性会逐渐降低)
答案 1 :(得分:1)
你在这里有一个在概念上令人困惑的冗余,尽管你可能需要这个。如果你从头开始这样做,你可以简单地让订单具有Customer.CustomerID的NULLable FK。这将满足拥有1个客户 - 许多订单和1/0订单给客户。您也可以通过使用联结表来实现,因为这在技术上是多对多的关系。
最好的选择取决于您查询数据的方式。例如,在Orders表上执行分析类型查询可能更方便
查找没有客户的订单
SELECT SUM(CASE WHEN customer iS NULL THEN 1 ELSE 0 END) FROM Orders
VS
SELECT SUM(CASE WHEN j.oid iS NULL THEN 1 ELSE 0 END) FROM
Orders o LEFT OUTER JOIN Junction j
WHERE o.o_id = j.o_id
您可以提供一些示例,其他人也可以提供更清晰,更有效的查询。