具有默认一对多关系的数据库问题

Database Question with one-to-many relationship with default

我有一个用户 table 和一个地址 table。 User 可以有多个地址,因此 Address table 条目有一个指向 User 的外键。

我的问题是:用户可以有多个地址,但只能将一个地址标记为主要地址(用于运送目的)。最好是向名为 "main_address" 的用户添加一个链接到他的地址之一的外键,还是向名为 "is_main" 的地址 table 添加一列(所有地址默认为 0 , 1 代表主要地址)?更好的意思是速度和存储方面:)

编辑:按照建议,我将外键添加到用户,但这是有问题的。如果 User 和 Address 还不在数据库中,则会导致循环依赖:A User cannot be added without the Address,而 Address cannot be added with the User。感谢大家!

user table 上有一个外键,这是可选的,以避免相互依赖,防止向其中任何一个添加记录,这可能是更清洁的解决方案。它避免了必须处理防止用户的多个主地址,占用更少 space,并使连接使用主地址的信息更简单。

唯一性内置于外键设计中。对于 "is_main" 设计,最简单的预防措施是将字段设置为 1 或 null(而不是 1 或 0)并在 (user_id, is_main) 上放置一个复合唯一键;然后要更改默认值,您必须先取消旧默认值,然后再将新默认值设置为 1。

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

获取具有默认地址的用户:

SELECT * 
FROM user AS u 
LEFT JOIN address AS a 
   ON u.main_address_id = a.address_id 
WHERE u.user_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 = ?
;

...AND is_main = 1 可能看起来像一件微不足道的事情,在很多情况下它会是这样,但在更复杂的查询中,它是那种可能意味着不要采取的事情的索引。

然而,is_main 设计的一个好处是:如果您已经有了 user_id 而不是 main_address_id,您可以通过简单的(无连接)获取主要地址信息) select 仅来自地址 table.