具有两个表和外键关系的数据库。
Person Address
------ -----------
person (fk)
在此示例中,一个人可以拥有许多地址。如何为一个人申报默认地址最好?以下2个建议选项是否有任何进一步的优点或缺点?
将boolean
名为is_default
的{{1}}字段添加到Address
表格。
将foreign key
名为default_address
的{{1}}字段添加到Person
表格。
关于这两个选项的一些想法。
person
表中is_default
和Address
属性的唯一性约束default_address
表中的Person
属性位于将该人作为其人员的地址集中问题还延伸到您希望定义多个默认地址的情况,即一个人可能有一个默认送货地址和一个默认帐单地址。在这种情况下,使用选项2将比在选项1中存储在数据库中的空间更少,并且当您添加更多默认字段时更多。
关于使用选项2的另一个想法是,地址是否为默认地址是该人的财产,而不是地址。
答案 0 :(得分:0)
选项1(在地址表上保留默认标志)的问题在于,您需要使用代码来强制将默认标志限制为每人每种默认值一个。没有声明性约束可以帮助您执行此操作。 FK对人的唯一性约束和您的is-default标志将不起作用,因为每个人可能有多个非默认地址,并且更改is-default标志将始终是两步取消设置在设置新默认值之前的旧默认值。
选项2(FK从人到默认地址)的问题在于您有循环引用。这要求您拥有管理保存地址的鸡和蛋问题的代码,然后将其作为两个单独事务中的默认值。您还需要代码以确保您设置的默认地址是属于该人的地址(而不是其他人)。
无论哪种方式,您都必须编写一些应用程序逻辑来使您选择的选项工作。你可以选择毒药。我两种方式都做过这种事情。最后,我认为您的第一个选择更容易管理。