Mysql 与默认值有一对多关系的数据库问题

Mysql 与默认值有一对多关系的数据库问题,mysql,database,one-to-many,default,one-to-one,Mysql,Database,One To Many,Default,One To One,我有一个用户表和一个地址表。用户可以有许多地址,因此地址表条目对用户具有外键 我的问题是:用户可以有多个地址,但只能将其中一个标记为主地址(用于发货目的)。向名为“main_address”的用户添加一个外键(该用户链接到他的一个地址)更好,还是向名为“Is_main”的地址表添加一列更好(默认情况下,所有地址为0,主地址为1)?我所说的更好是指速度和存储方面:) 编辑:根据建议,我向用户添加了外键,但这是有问题的。如果用户和地址还不在数据库中,则会导致循环依赖:没有地址就不能添加用户,没有用户

我有一个用户表和一个地址表。用户可以有许多地址,因此地址表条目对用户具有外键

我的问题是:用户可以有多个地址,但只能将其中一个标记为主地址(用于发货目的)。向名为“main_address”的用户添加一个外键(该用户链接到他的一个地址)更好,还是向名为“Is_main”的地址表添加一列更好(默认情况下,所有地址为0,主地址为1)?我所说的更好是指速度和存储方面:)


编辑:根据建议,我向用户添加了外键,但这是有问题的。如果用户和地址还不在数据库中,则会导致循环依赖:没有地址就不能添加用户,没有用户就不能添加地址。谢谢大家

用户
表上有一个外键可能是更干净的解决方案,该外键是可选的,以避免相互依赖性,从而阻止向其中添加记录。它避免了为用户防止多个主地址的问题,占用了更少的空间,并使连接使用主地址信息变得更简单

独特性内置于外键设计中。使用“is_main”设计时,最简单的预防措施是将字段设为1或null(而不是1或0),并在其上放置一个复合唯一键(user_id,is_main);然后要更改默认值,在将新默认值设置为1之前,必须先清空旧默认值

外键字段大约占用4个字节(假设地址为int pk,忽略可空性);is_main为用户可能拥有的每个地址至少占用1字节。。。如果还有其他位字段,它可能会更小,但空间方面的问题确实微不足道

要获取具有默认地址的用户,请执行以下操作:

SELECT * 
FROM user AS u 
LEFT JOIN address AS a 
   ON u.main_address_id = a.address_id 
WHERE u.user_id = ?
;
vs

…那
和is_main=1
可能看起来像是一件小事,在很多情况下都会是,但在更复杂的查询中,这可能意味着不需要索引


然而,主设计的一个好处是:如果您已经有了用户id,但没有主地址id,那么您只需从地址表中选择一个简单的(无连接)即可获得主地址信息。

在第二个查询中,它应该是u.user\u id=a.user\u id,因为在这种情况下没有
u.default\u address\u id
。啊,是的,我忽略了他们已经有了这个领域的名字。。。不过还是比我的好一点将编辑到主地址这不是我的意思。如果您有
a.is\u main
,则不需要
u.default\u address\u id
。关于:
插入地址(address\u id,user\u id)值(9,1);更新用户设置主地址\u id=9,其中用户\u id=2
?:-)这有点复杂,我可能会建议
约束外键main_address_fk(user_id,main_address_id)在删除时引用地址(user_id,address_id)在更新时进行限制
;但只限于限制。但即使这样也感觉有点脏。。。可能是更新前触发的,重复检查会更干净。
SELECT * 
FROM users AS u 
LEFT JOIN address AS a 
   ON u.user_id = a.user_id 
   AND a.is_main = 1 
WHERE u.user_id = ?
;