Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 数据库表是否可以引用多个表而不违反任何设计原则_Mysql_Database - Fatal编程技术网

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引用它们的想法。这可能有助于避免冗余,因为客户从不更改地址,并且发货和计费都相同。