2011-10-12 68 views
4

假设我有一个与另一个表1:0..1关系的客户表,我通常会在客户表中指向另一个表的Nullable FK。1到0..1的关系 - FK指向哪个方向?

然而,说与客户有关的其他可选数据片断的数量会增加,仅仅因为参数的缘故,表的数量现在是10个。最好是使用相同的体系结构,以便有10个额外的客户表中的列,如果没有存储额外的数据,全部可能为空,或者FK指向孩子的客户表是否更好?这个模型看起来很整洁,因为我没有大量可为空的列,如果需要的话,我可以逐渐扩展系统,只需在新表中添加新表格和指向客户的新FK列。唯一的缺点是,它看起来(查看数据库),你可以添加更多的行打破1:0-1关系规则。但是,我的应用程序永远不会插入额外的行。

第一种方法要求我为每个添加到系统中的新表格添加客户表末尾的新列。

在这种情况下哪种方法最好?

+0

另请参阅此关系问题:http://stackoverflow.com/questions/5177991/normalization-of-an-11-or-10-relationship – Hibou57

回答

3

答案是机械地从功能依赖的想法中派生出来的。

对于一个关系中存在的值,这意味着值必须存在于另一个关系中。如果这是真的,届时将有来自相关表(前)外键约束的独立表(后者)

看待这个另一种方式是一对一的关系,实际上只是一个特殊的一对多关系的情况;只有而不是许多,你只有一个。

在SQL

CREATE TABLE independent (
    id INTEGER PRIMARY KEY 
); 

CREATE TABLE dependent (
    independent_id INTEGER UNIQUE NOT NULL FOREIGN KEY REFERENCES independent(id) 
); 

像一对多,“众多”有一个外键“一”,但打开“多”到“一”,只是使它unique。这是典型的便利通过使外键列上的依赖关系的主键的这种关系来表达这一切:

CREATE TABLE dependent (
    independent_id INTEGER PRIMARY KEY FOREIGN KEY REFERENCES independent(id) 
); 

编辑:我注意到您的标题提出了一个不同的问题比你的身体似乎问。以上回答标题。

从数据库规范化的角度来看,可能最好使用多个表,如上所述,以支持可空属性。空值是一种带外方式,表示特定属性的价值在某种程度上是“特殊的”,但并不真正强化对可能意味着什么的任何特定解释。空manager_id可能意味着完全不同于空birthdate,即使它们具有相同的标记。

从严格的抽象或学术的角度来看,添加表格并不是一件坏事;也没有添加属性。选择应始终基于您实际需要建模的数据类型。

这就是说,有一些非常实际的原因使用其中一个或另一个。最明显的性能原因来自于使用其中一个或另一个的空间成本。当通常使用可选值时,外键和相应索引使用的额外空间不会很好地支付。同样,如果可选值很少使用;将这些值放在另一个关系中更加紧凑。具有可空属性会占用表中几乎不用的空间。

找出哪些基本上需要实际的数据,以及性能测试这些(也许是其他)配置,看看哪个最好。

-1

部分答案:

请记住,打破了表二用1-1或1-0..1关系,始终需要这些表之间的附加连接。

如果您经常需要从两个表中一起返回数据,并且这些表的负载很重,那么在较大的单个表中使用“吨的NULL值”会更好。

+1

这将是很好,在评论中添加downvote原因... –