Mysql 数据库表是否可以引用多个表而不违反任何设计原则
这就是最佳实践问题 我有三张表:订单、客户和地址Mysql 数据库表是否可以引用多个表而不违反任何设计原则,mysql,database,Mysql,Database,这就是最佳实践问题 我有三张表:订单、客户和地址 Order ------ ID ADDRESS_ID Customer ------ ID Address ------ ID CUSTOMER_ID IS_HIDDEN 用户可以有多个地址,并且可以随时自由编辑。当用户下订单时,我需要存储他当时地址的快照,将其与订单关联,并使其对用户不可用。换句话说,我想复制地址行,它将由订单表而不是客户拥有。这种所有权需要以某种方式表示,例如使用IS_隐藏标志 地址表中的某些数据有时由客户表拥有,有
Order
------
ID
ADDRESS_ID
Customer
------
ID
Address
------
ID
CUSTOMER_ID
IS_HIDDEN
用户可以有多个地址,并且可以随时自由编辑。当用户下订单时,我需要存储他当时地址的快照,将其与订单关联,并使其对用户不可用。换句话说,我想复制地址行,它将由订单表而不是客户拥有。这种所有权需要以某种方式表示,例如使用IS_隐藏标志
地址表中的某些数据有时由客户表拥有,有时由订单拥有,这种方法正确吗
另一种解决方案是按顺序复制地址表中的所有列,以便明确所有权,但我对模式中的复制有不好的感觉。如果您确实想要地址的快照,您可能应该按顺序存储地址,而不是单独的表 您将使查询和数据变得不必要的复杂 使用您描述的实现,无论如何都会得到重复 例如: 客户地址=1街 客户下单地址隐藏在表中 客户使用相同的地址下另一个订单。地址是 保存并隐藏在表中 最终结果将是:
Customer ID | Address | Hidden
1 | 1 street | false
1 | 1 street | true
1 | 1 street | true
如果您真的想要地址的快照,您可能应该按顺序存储地址,而不是单独的表 您将使查询和数据变得不必要的复杂 使用您描述的实现,无论如何都会得到重复 例如: 客户地址=1街 客户下单地址隐藏在表中 客户使用相同的地址下另一个订单。地址是 保存并隐藏在表中 最终结果将是:
Customer ID | Address | Hidden
1 | 1 street | false
1 | 1 street | true
1 | 1 street | true
请使用链接表(有时称为关联表)将地址链接到它应该链接到的内容 客户和订单不属于地址的一部分,因此不应包含在该表中以实现适当的规范化 试试像这样的东西
customer_address
------------------
customer_id
address_id
begin_dt
end_dt
type <- indicate physical location, mailing address etc.
同样地
order_address
---------------
order_id
address_id
type <- ship to, bill to - or others.
请使用链接表(有时称为关联表)将地址链接到它应该链接到的内容 客户和订单不属于地址的一部分,因此不应包含在该表中以实现适当的规范化 试试像这样的东西
customer_address
------------------
customer_id
address_id
begin_dt
end_dt
type <- indicate physical location, mailing address etc.
同样地
order_address
---------------
order_id
address_id
type <- ship to, bill to - or others.
我宁愿使用OrderAddress表,这样订单就可以拥有这些地址。我认为这样会更好,因为上面的@PeterHagström清楚地说明了所有权协议。如果您决定使用is_hidden方法,我建议仅当用户试图编辑现有订单正在使用的地址时,才复制该地址。因此,在大多数情况下,订单和客户将指向同一地址行。同意Peter的观点,这样的OrderAddress表将包含每个订单及其在特定时间点的对应地址的快照。@PeterHagström:接受您的建议是否意味着客户应该拥有CustomerAddress表?到目前为止,我看到的做法主要是将所有订单信息(包括发货地址和帐单地址)直接保存在点菜台。但是,我有点喜欢将所有地址存储在地址表中,然后仅通过id引用它们。这可能有助于避免冗余,因为客户从不更改地址,并且发货和计费都相同。我更喜欢使用OrderAddress表,这样订单就可以拥有地址。我认为这样会更好,因为上面的@PeterHagström清楚地说明了所有权协议。如果您决定使用is_hidden方法,我建议仅当用户试图编辑现有订单正在使用的地址时,才复制该地址。因此,在大多数情况下,订单和客户将指向同一地址行。同意Peter的观点,这样的OrderAddress表将包含每个订单及其在特定时间点的对应地址的快照。@PeterHagström:接受您的建议是否意味着客户应该拥有CustomerAddress表?到目前为止,我看到的做法主要是将所有订单信息(包括发货地址和帐单地址)直接保存在点菜台。然而,我有点喜欢将所有地址存储在地址表中,然后通过id引用它们的想法。这可能有助于避免冗余,因为客户从不更改地址,并且发货和计费都相同。