【发布时间】:2016-03-20 11:42:50
【问题描述】:
有一个名为Item(id, name, cost) 的表用于跟踪可能的项目,Orders(id, bill_id, item_id, units) 用于跟踪下达的订单,其中相同的bill_id 表示它属于单个订单。
如果需要在Order 表中将item_id 添加为item_id,如何在DB 中施加额外的约束,表明Item 应该是“可用”(在那个时间点)?
我首选的架构设计是添加一个 Type 列,其中包含“可用”和“不可用”字段。但是我如何检查Foreign Key 约束item_id 不仅应该是Item 表中的Primary Key,它的Type 也应该是Available。
使用check constraints 的几个答案似乎接近How to make a foreign key with a constraint on the referenced table in PostgreSQL 和Foreign key with additional relationship constraint。
我不喜欢的另一种模式设计是有一个名为“菜单”的表,它可能只有 Items 可用。问题是这个表在本质上会变得非常动态和事务性,并且它会根据项目的可用性不断变化。我只是根据其状态从Items 创建一个子表,这似乎不是一个好主意。
您会选择哪种架构设计和方法?
用例就像零售商想要确保他的所有订单都针对“有货”的商品。当然,以后可以将“可用”更改为“不可用”。可以使Orders 保持约束,但我不确定历史上是否有一个曲目是否真的可用,甚至来自本专栏。如果 RDBMS 可以存储此类信息,我不知道。
【问题讨论】:
标签: database postgresql foreign-keys constraints