声明外键反向的默认值的最佳方法

时间:2014-09-30 08:07:48

标签: sql database-design relational-database

具有两个表和外键关系的数据库。

Person     Address
------     -----------
           person (fk)

在此示例中,一个人可以拥有许多地址。如何为一个人申报默认地址最好?以下2个建议选项是否有任何进一步的优点或缺点?


选项1

boolean名为is_default的{​​{1}}字段添加到Address表格。

选项2

foreign key名为default_address的{​​{1}}字段添加到Person表格。


关于这两个选项的一些想法。

  • 对任一选项使用约束
    • 选项1,person表中is_defaultAddress属性的唯一性约束
    • 选项2,default_address表中的Person属性位于将该人作为其人员的地址集中
  • 与选项1
  • 相比,选项2在数据库中存储的空间更少

问题还延伸到您希望定义多个默认地址的情况,即一个人可能有一个默认送货地址和一个默认帐单地址。在这种情况下,使用选项2将比在选项1中存储在数据库中的空间更少,并且当您添加更多默认字段时更多。


关于使用选项2的另一个想法是,地址是否为默认地址是该人的财产,而不是地址。

1 个答案:

答案 0 :(得分:0)

选项1(在地址表上保留默认标志)的问题在于,您需要使用代码来强制将默认标志限制为每人每种默认值一个。没有声明性约束可以帮助您执行此操作。 FK对人的唯一性约束和您的is-default标志将不起作用,因为每个人可能有多个非默认地址,并且更改is-default标志将始终是两步取消设置在设置新默认值之前的旧默认值。

选项2(FK从人到默认地址)的问题在于您有循环引用。这要求您拥有管理保存地址的鸡和蛋问题的代码,然后将其作为两个单独事务中的默认值。您还需要代码以确保您设置的默认地址是属于该人的地址(而不是其他人)。

无论哪种方式,您都必须编写一些应用程序逻辑来使您选择的选项工作。你可以选择毒药。我两种方式都做过这种事情。最后,我认为您的第一个选择更容易管理。