具有附加约束的外键?

时间:2016-03-20 11:42:50

标签: database postgresql foreign-keys constraints

有一个名为Item(id, name, cost)的表来跟踪可能的项目,Orders(id, bill_id, item_id, units)用于跟踪订单,bill_id表示订单属于单个订单。

如果需要在Item表中添加item_id,如何在数据库中强加一个额外约束Order应该是“可用”(在那个时间点) ?

我首选的架构设计是添加一个Type列,其中包含“可用”和“不可用”字段。但是,如何检查Foreign Key约束item_id不仅应该是Primary Key表中的Item,还应该Type Available check constraints

使用Items的几个答案似乎接近How to make a foreign key with a constraint on the referenced table in PostgreSQLForeign key with additional relationship constraint

另一种我不喜欢的架构设计是有一个叫做“菜单”的表,它可能只有 Items可用。问题是这个表本质上是非常动态和事务性的,它会根据项目的可用性而不断变化。而我只是根据Orders创建一个子集表,这取决于它的状态,这似乎并不是一个好主意。

您会选择哪种架构设计和方法?

用例就像零售商想要确保他的所有订单都是针对“可用”的商品。当然,可以在以后的某个时间将“可用”更改为“不可用”。可以使 <?php echo '<img src="'.get_template_directory_uri().'/images/image.jpg'">' ?> 保留一个约束,但我不确定一个历史上是否有一个跟踪是否真的可用,甚至不是这个列。如果RDBMS可以存储此类信息,我不会这样做。

1 个答案:

答案 0 :(得分:1)

AFAIK,我认为任何RDBMS都不允许提供额外的约束以及参照完整性约束。在您的方案中,您应该通过在Items表上执行SQL SELECT语句来验证项目当前是否可用,如果是,则在单个数据库事务中将该项目添加到Orders表。当然,您可以在Items表中使用Type或Status列来检查项是否可用。或者您可能希望在表格中有库存列,以检查所需数量/单位的项目是否可用。

您可以使用类型列和使用检查约束的想法来实现,但我认为这不是一个好主意。在这种情况下,您不仅要在Items表中使用Type列,还要在Orders表中使用Type列。然后在Orders表上有一个检查约束为CHECK(Type =&#39; Available&#39;)。

已经存在类似的问题PostgreSQL check constraint for foreign key condition

这将通过使用用户定义的函数来解决您的问题。