Database design 为客户机和客户机有主地址的地址设计表时,哪种方法更好?

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

一个客户机可能在数据库中记录了两个地址,一个是主地址,另一个是辅助地址,本文旨在确定解决此问题的更好设计

我确定了以下解决方案,您还有其他解决方案吗

解决方案1:

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只允许每个客户端有一个地址-这很难实现。这取决于上下文。。。比如政府、电力、互联网供应商,。。。对于许多业务,您只有一个地址。一个地址可以由多个客户共享(例如,公司的邮政地址将与该公司的任何员工关联)