2

这是“什么是最佳实践”的问题。

我有 3 个表:订单、客户和地址。

Order
------
ID
ADDRESS_ID


Customer
------
ID


Address
------
ID
CUSTOMER_ID
IS_HIDDEN

用户可以有多个地址,并且可以随时自由编辑它们。当用户下订单时,我需要存储他当时地址的“快照”,将其与订单相关联并使其对用户不可用。换句话说,我想复制将由 Order 表而不是 Customer 拥有的地址行。需要以某种方式指示此所有权(例如使用 IS_HIDDEN 标志)。

这是正确的方法,地址表中的某些数据有时由客户表“拥有”,有时由“订单”“拥有”吗?

另一种解决方案是按顺序复制地址表中的所有列,因此所有权将是明确的,但我对模式中的重复有不好的感觉。

4

2 回答 2

3

如果您真的想要地址的快照,您可能应该将地址存储在order中,而不是单独的表中。

您将使您的查询和数据变得不必要地复杂。

通过您所描述的实现,无论如何您都会得到重复。

例子:

客户地址 = 1 条街道

客户下订单的地址隐藏在表格中。

客户使用相同的地址再次下订单。地址被保存并隐藏在表格中。

最终结果将是:

Customer ID | Address  | Hidden  
    1       | 1 street |  false  
    1       | 1 street |  true  
    1       | 1 street |  true  
于 2013-01-08T16:08:16.000 回答
1

请使用链接表(有时称为关联表)将地址链接到它应该链接到的东西。

“客户”和“订单”不是地址的一部分 - 并且不应包含在该表中以进行适当的规范化。

尝试类似的东西

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.
于 2013-01-08T16:11:18.270 回答