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

问题描述 投票:1回答:1

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

我的问题是:用户可以拥有多个地址,但只能标记一个地址作为主要地址(出于运输目的)。是否更好地将一个外键添加到名为“main_address”的用户链接到他的一个地址,或者将一个列添加到名为“is_main”的地址表中(所有地址默认为0,主地址为1) ?更好的是我的意思是速度和存储明智:)

编辑:根据建议,我将外键添加到用户,但这是有问题的。如果用户和地址尚未在数据库中,则会导致循环依赖:如果没有地址,则无法添加用户,并且如果没有用户,则无法添加地址。谢谢大家!

mysql database one-to-many default one-to-one
1个回答
1
投票

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

外观设计的独特之处在于外键。使用“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

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,则可以通过仅从地址表中选择简单(无连接)来获取主地址信息。

© www.soinside.com 2019 - 2024. All rights reserved.