【问题标题】:Foreign key with additional constraints?具有附加约束的外键?
【发布时间】: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 PostgreSQLForeign key with additional relationship constraint

我不喜欢的另一种模式设计是有一个名为“菜单”的表,它可能只有 Items 可用。问题是这个表在本质上会变得非常动态和事务性,并且它会根据项目的可用性不断变化。我只是根据其状态从Items 创建一个子表,这似乎不是一个好主意。

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

用例就像零售商想要确保他的所有订单都针对“有货”的商品。当然,以后可以将“可用”更改为“不可用”。可以使Orders 保持约束,但我不确定历史上是否有一个曲目是否真的可用,甚至来自本专栏。如果 RDBMS 可以存储此类信息,我不知道。

【问题讨论】:

    标签: database postgresql foreign-keys constraints


    【解决方案1】:

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

    您可以使用拥有类型列和使用检查约束的想法来实现,但我认为这不是一个好主意。在这种情况下,您不仅必须在 Items 表中而且在 Orders 表中都有 Type 列。然后将 Orders 表的检查约束设置为 CHECK (Type = 'Available')。

    已经有类似问题PostgreSQL check constraint for foreign key condition

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

    【讨论】:

    • 那么从理论角度来看,解决这个问题的最佳思路是什么?所有这些都应该在编程级别而不是数据库级别处理吗? DB 仅在使用 DB 约束或以编程方式应用此类约束后保存数据。
    • 或者还有我刚才所说的其他模式设计,它在一个名为“菜单”的表中包含所有可用项目,我可以使用它的主键。然而,这听起来像是真正的冗余数据。
    • 我的建议是在编程级别而不是在数据库级别进行处理。不要使用您的“菜单”想法。
    • 但是您可以在数据库级别进行处理,也可以在为类似问题提供的解决方案中完成:stackoverflow.com/questions/23237471/…。这看起来非常适合您的应用,
    • 在这种特殊情况下在 DB 级别处理的唯一缺点是用户定义的函数不能跨 RDBM 移植。每个 RDBMS 都有自己定义函数和过程的方式!
    猜你喜欢
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 2016-07-28
    相关资源
    最近更新 更多