Database design 实施客户电话、发货详情和订单的最佳方式是什么?

Database design 实施客户电话、发货详情和订单的最佳方式是什么?,database-design,Database Design,我需要为客户存储多个电话和发货详细信息。此外,当客户制作和订购时,他将能够从输入的电话/发货详细信息中进行选择 例如,客户1可以有3部电话和5个装运详细信息。订购时,他应选择一部电话和一个装运地点 另一方面,我认为大多数人都会有一部手机和一个送货地点 现在,我有两种方法 表用户 表地址 表UserAddress(来自用户和地址的多对多) 桌上电话 表UserPhones(来自用户和电话的多对多) 表顺序-两个字段:电话和地址,从相应的表中填充(作为字符串) 缺点是存储字符串而不是引用。因此,空间

我需要为客户存储多个电话和发货详细信息。此外,当客户制作和订购时,他将能够从输入的电话/发货详细信息中进行选择

例如,客户1可以有3部电话和5个装运详细信息。订购时,他应选择一部电话和一个装运地点

另一方面,我认为大多数人都会有一部手机和一个送货地点

现在,我有两种方法

  • 表用户
    表地址
    表UserAddress(来自用户和地址的多对多)
    桌上电话
    表UserPhones(来自用户和电话的多对多)
    表顺序-两个字段:电话和地址,从相应的表中填充(作为字符串)

    缺点是存储字符串而不是引用。因此,空间利用效率低下

  • 表用户
    表地址
    表UserAddress(来自用户和地址的多对多)
    桌上电话
    表UserPhones(来自用户和电话的多对多)
    表UserInfo(来自UserAddress和UserPhone的多对多)
    表顺序-一个字段:对UserInfo的引用

    缺点是用户id在UserAddress表和UserPhones表中都存在


  • 实现这种设计的最佳方法是什么?

    使用第一种方法,但只需更改
    顺序
    即可获得
    用户电话ID
    用户地址ID
    (外键分别链接到
    用户电话中的主键
    ID
    用户地址中的
    ID

    这就要求,一旦下了订单,就要创建
    UserPhone
    条目,并且用户只能发送到链接到其帐户的地址,但这是有意义的

    由于一部手机(大概)不能属于多个用户,您可能希望将
    UserPhone
    全部废弃,只需在
    phone
    中添加一个
    UserID
    字段

    同样地,废弃
    UserAddress
    也有意义,尽管保留它有两个好处:

    • 您不需要为居住在同一地址的用户重复所有数据。
      对于居住在同一地址的用户来说,这是重复地址和使用比居住在某个地址的唯一用户所需的更多空间之间的折衷。最好的选择实际上取决于数据

    • 很容易将使用相同地址的用户链接起来,这可能有助于统计等目的

    缺点是用户id在UserAddress表和UserPhones表中都存在

    这并不是一个真正的缺点

    如果用户可以有多个电话或地址,这是最好的建模方法。

    为什么要复杂化

    • 表用户
    • 表UserAddresses(引用用户)
    • 表UserPhones(参考用户)
    • 表顺序(参考用户、用户地址和用户电话)

    想了想。不是很优雅,因为我们实际上存储了三次用户ID。这就是在关系数据库中实现引用的方式。这不是多余的,谢谢。我认为这是最好的选择。