database - 有额外约束的外键?

标签 database postgresql foreign-keys constraints

有一个名为 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 PostgreSQLForeign 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/

相关文章:

sql - 我在 PostgreSql : number of referencing and referenced columns for foreign key disagree 中收到错误

mysql - 外键可以是另一个表的复合主键的一部分吗?

mysql - 如何用 MySQL 实现物化 View ?

sql - 在 MySQL 中获取死锁

php - pdo 查询仅在第一次有效

database - 保护数据库访问凭证的安全

postgresql - Dbup(.net 库)和 Powershell for Postgresql

php - PostgreSQL 插入不工作

c++ - 如何从文件中读取数据 block ,然后从该 block 读取到 vector 中?

MySQL 仅在存在外键约束时才删除外键约束