在网上商店中,有两个(与此问题相关)表:UserSnapshot
和Purchase
。在进行购买时,用户的当前信息是快照,使得即使稍后移除或更改用户,购买记录也是完整的。这提供了1:1的关系,其中每次购买只有一个用户快照,每个用户快照只有一次购买。
我的问题是,我该如何实现?我应该有一个外键指向购买表中的用户快照,反过来,还是应该同时使用(冗余)?我应该把两者结合起来(凌乱)吗?序列化用户快照(不遵守每个字段的一个值')?
答案 0 :(得分:1)
我建议查看您想要运行的可能查询,并在此基础上设计您的模型。
例如,我想您想知道“这个客户放置了哪些订单?”。最自然的表达方式如下:
select *
from customer c
inner join customer_snapshot cs
on c.customer_id = cs.customer_id
inner join orders o
on cs.order_id = o.order_id
其中c.customer_id =?
或者:“下订单的客户的当前状态是什么?”。
select *
from order o
inner join customer_snapshot cs
on o.order_id = cs.order_id
inner join customer c
on cs.customer_id = c.customer_id
where o.order_id = ?
这对我来说很自然,因为它几乎将customer_snapshot表用作“多对多”连接表。
但这主要是风格 - 加入可以很容易地在o.customer_snapshot_id = cs.customer_snapshot_id
。
“向居住在x市的客户发送了多少订单?”
select *
from order o
inner join customer_snapshot cs
on o.order_id = cs.order_id
inner join customer c
on cs.customer_id = c.customer_id
and cs.city = ?
您不需要“冗余”列 - 所有查询都可以在不跳过循环的情况下工作。您可以序列化快照数据,但随后“哪些订单适用于居住在城市x的客户”查询将会很痛苦。