Database design 如何确保跨多个表的业务规则完整性?

Database design 如何确保跨多个表的业务规则完整性?,database-design,database-normalization,Database Design,Database Normalization,我试图确保跨多个表的数据完整性,这个问题不是DBMS特有的,而是一个理论问题。以下是测试表的布局: Purchase PurchaseID CustomerID ItemID CustomerTypeDiscountID 1 23 4 2 Customer CustomerID Customer Name CustomerTypeID 23 M

我试图确保跨多个表的数据完整性,这个问题不是DBMS特有的,而是一个理论问题。以下是测试表的布局:

Purchase
PurchaseID   CustomerID   ItemID    CustomerTypeDiscountID
         1           23        4                         2

Customer
CustomerID    Customer Name   CustomerTypeID
        23       Mike Smith                3
        24         John Doe                1

CustomerTypes
CustomerTypeID    CustomerTypeDescription
             1                        New
             2                        Old
             3                  Returning

Discounts
DiscountID   PercentDiscount
         1                 5
         2                10
         3                15
         4                20
         5                25
         6                30

CustomerTypeDiscounts
CustomerTypeDiscountID   CustomerTypeID   DiscountID
                     1                3            6
                     2                3            5
                     3                1            4
                     4                2            1
您可以看到,在购买表中,购买1的折扣为25%,因为客户23(Mike Smith)是返回的客户类型,可以通过客户类型折扣ID 2获得折扣5(25%)

返回的客户也可以获得30%的折扣

但是,如何使用外键约束确保在Purchase表中CustomerTypeDiscountID始终适用于给定的CustomerID?例如,在本例中,对于此CustomerID,采购记录中的CustomerTypeDiscountID只能是1或2,它永远不会是3或4,以此类推,因为这些折扣不适合客户23的客户类型


谢谢。

仅使用外键无法强制执行该约束。它可以由触发器强制执行(例如,在插入或更新购买时进行检查)或在应用程序内部强制执行。我认为某些约束不能仅使用外键约束来描述/强制执行,它需要使用存储过程来完成,或者通过您建议的触发器。我认为这可能是通过在表上使用Check约束实现的,该约束将引用Select语句(连接CustomerType折扣、CustomerType和Customer)Check只能表示表间约束,而不能表示不同表之间的约束。如果您试图将此作为建模问题来执行,您将需要一个额外的表,而不是使用触发器。将带有FK的
CustomerDiscount(CustomerDiscountID(PK)、CustomerID、CustomerTypeID、CustomerTypeDiscountID)
添加到
Customer(CustomerID、CustomerTypeID)
中,然后将
CustomerDiscountID
添加到采购表中,同时删除
CustomerID
CustomerTypeDiscountID
。这会使事情有些复杂,但这通常是在数据库中实现完全引用完整性和在应用程序中处理某些事情之间的折衷。