有一个名为 Item(id, name, cost)
的表用于跟踪可能的 Items 和 Orders(id, bill_id, item_id, units)
创建用于跟踪订单下的相同 bill_id
表示它属于一个订单。
如果需要将其添加为 item_id
,如何在 DB 中施加额外的约束,说明 Item
应该是“可用的”(在那个时间点) Order
表?
我首选的架构设计是添加一个 Type
列,其中包含“可用”和“不可用”字段。但是如何检查 Foreign Key
约束 item_id
不应该只是 Item
表中的 Primary Key
,它的Type
也应该是 Available
。
使用检查约束
的几个答案似乎很接近 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 可以存储此类信息,我不知道。
最佳答案
据我所知,我认为任何 RDBMS 都不允许提供附加约束以及参照完整性约束。在您的场景中,您应该通过在 Items 表上执行 SQL SELECT 语句来验证某个项目当前是否可用,如果是,则在单个数据库事务中将项目添加到 Orders 表。当然,您可以在 Items 表中使用 Type 或 Status 列来检查某个项目是否可用。或者您可能希望在表中包含库存列以检查是否有所需数量/单位的商品。
您可以使用具有类型列并使用检查约束的想法来实现,但我认为这不是一个好主意。在这种情况下,您必须不仅在 Items 表中而且在 Orders 表中都有 Type 列。然后将 Orders 表的检查约束设置为 CHECK(类型 = 'Available')。
已经有类似问题PostgreSQL check constraint for foreign key condition
这将通过使用用户定义的函数来解决您的问题。
关于database - 有额外约束的外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36113255/