Database design 为客户机和客户机有主地址的地址设计表时,哪种方法更好?
一个客户机可能在数据库中记录了两个地址,一个是主地址,另一个是辅助地址,本文旨在确定解决此问题的更好设计 我确定了以下解决方案,您还有其他解决方案吗 解决方案1:Database design 为客户机和客户机有主地址的地址设计表时,哪种方法更好?,database-design,Database Design,一个客户机可能在数据库中记录了两个地址,一个是主地址,另一个是辅助地址,本文旨在确定解决此问题的更好设计 我确定了以下解决方案,您还有其他解决方案吗 解决方案1: Table Clients + name + surname Table Addresses + line1 + city + country + postcode + flag_primary 解决方案2: Table Clients + name + surname + primary_address_id Table Add
Table Clients
+ name
+ surname
Table Addresses
+ line1
+ city
+ country
+ postcode
+ flag_primary
解决方案2:
Table Clients
+ name
+ surname
+ primary_address_id
Table Addresses
+ line1
+ city
+ country
+ postcode
解决方案3:
Table Clients
+ id
+ name
+ surname
Table Addresses
+ id
+ user_id
+ line1
+ city
+ country
+ postcode
Table User_Settings
+ user_id
+ address_id
请解释为什么您认为您的建议是正确的。显然,请执行解决方案2 逻辑:当客户端更改其主地址时,不会更改地址。这反映在db模式中 腐败:拥有一个有两个主地址的客户机是不会让你感到奇怪的。解决方案1可以有两个布尔标志为true 简单性:当您更改客户端地址时,只需一次更新即可完成。对于解决方案1,您需要执行2次更新。。。可能在一个棘手的SQL查询中,但这是两个更新 可扩展性:如果有一天,你希望地址是“可共享的”,就像不为住在同一个地方的两个人存储相同的确切地址一样,你不会破坏你的“主地址”功能,因为它存储在用户上。在解决方案1中,它需要重构 符合所有“版本控制”系统:客户端更改其主地址?=>客户端已更新=>存储此客户端的旧版本或更新行。 对于解决方案1,您将破坏它或必须自己更改默认行为 编辑:如果你在我们回答问题后编辑你的问题,会让我们的答案看起来很傻 如果您现在计划每个客户机有多个地址,但仍然是主地址,请建议您这样做
client
primary_address (fk to address(id))
address
client (fk to client(id))
因为有两个实体-客户和地址 只有当且仅当客户机使用该地址存在时,地址才会存在。因此,地址实体依赖于客户端实体,因此您可以将地址实体中的客户端id作为外键 你可以有这样的东西:
Table Clients
+ client_id
+ name
+ surname
Table Addresses
+ line1
+ city
+ country
+ postcode
+ flag_primary
+ client_id [FOREIGN_KEY]
在现实世界中,一个客户将有多个地址,一个地址可由多个客户共享(例如,公司的邮政地址) 我会在客户机和地址之间建立多对多关系,并用一个标志指示哪个地址是主要地址。甚至是一种类型(“邮寄”、“访问”…) 表
客户机
id
(主键)
名字
姓氏
表地址
id
(主键)
line1
城市
postcode
表客户地址
地址\u id
(FK到地址
)
client\u id
(FK到client
)
是主要的
(布尔值,真/假)
根据实际的数据库产品,“每个客户机只有一个主地址”可以通过对客户机\u地址
表“这取决于”:-)的唯一约束强制执行。在现实世界中,一个人可能有多个地址,而且多人可能共享一个地址,这意味着需要多对多关系Hello。。我编辑问题是为了添加解决方案3,我可以知道你的想法吗?嗨,谢谢你的帮助。当你想提到解决方案一时,你似乎提到了解决方案二,我错了吗?因为解决方案1是一个带有标志的解决方案。解决方案2只允许每个客户端有一个地址-这很难实现。这取决于上下文。。。比如政府、电力、互联网供应商,。。。对于许多业务,您只有一个地址。一个地址可以由多个客户共享(例如,公司的邮政地址将与该公司的任何员工关联)