数据库设计 - 使用FK还是单独表?

时间:2011-11-22 00:00:11

标签: sql-server-2008

说我有一个名为'A'的表。表'A'与表'B'的关系可以是1:0或1:1。表'A'中大约95%的行不会引用表'B'中的任何行。

所以,我可以通过两种不同的方式做到这一点。

1

在表'A'中,我可以在表'B'上有一个FK列。但是,大约95%的行将在此FK列中包含NULL值。

2

我可以创建一个表'C',其中包含表'A'的FK列和表'B'的FK列。然后,我只会在表'A'和'B'之间存在关系的5%的情况下向表'C'添加一行。

我还应该提到表'B'中的一行可以指向表'A'中的许多行。

哪种方法可以解决这个问题?

2 个答案:

答案 0 :(得分:0)

更新:你有一个N:0..1(与1:0..1不同)。在这种情况下,您的2种解决方案是唯一可行的解​​决方案。在实践中,它可能取决于您希望优化的情况;我会简单地选择一张桌子。

通常,解决方案1的简单性会使其更受欢迎。您可以轻松地与表B进行连接,并且可以在没有连接的情况下过滤NULL / NOT NULL。

理论上,解2更接近理论归一化理想;在实践中,它是复杂的,我能想象的唯一情况是更好的是空间是非常宝贵的,你的桌子真的很大;但是,如果是这种情况,可能需要转到一些NO-SQL模式。

编辑:这个段落无效:您错过了另一种可能的解决方案。在B中有一个指向A的外键。从您在问题中的说法看,B中的每个记录似乎都必须在A中有记录。因此,您可以从B指向A中的主键,并且不存在任何表中的空记录。当然,在没有连接的情况下,如果没有相应的B,您将无法检查A中的记录。

为了决定使用哪种策略,您可能需要更具体地查询要查询的内容和用例;那么,你可以优化某种策略。

答案 1 :(得分:0)

我不推荐第一个。

相反,我建议表B包含表A的FK,然后B中约5%的行将包含NULL,其中不存在任何关系。

第三个表C的第二种方法更加规范化,但权衡是每次要查询关系时执行额外的连接。