我正在尝试将以下实体模型付诸实践:
我们有一个 Payments 列表,每个 Payment 属于某个商店并且属于某种支付类型(例如 Store1 中的 10 欧元维护成本,Store2 中的 20 欧元租金)
付款类型是一个类别,例如(租金、维护、法律费用、许可证),每个类别都分配有一个特定的 account_type (例如,budget_legal、budget_monthly、budget_extraordinary),其中多个付款类型可以具有相同的 account_type
我们有帐户:一个帐户属于某个帐户类型的某个商店。所以 Store1 可以有账户类型budget_legal、budget_monthly,而Store2 有账户类型budget_legal、budget_monthly 和budget_extra
关系模型:
使用http://draw.io/创建的图像
现在我想要一个约束,即每笔付款必须属于现有帐户。我要保证以下几点:
当我更改 Payment_type 的 account_type 时,这种类型的所有付款都将“属于”各个帐户。
如果我删除一个帐户,我想删除该帐户中的所有付款(例如删除外键中的级联)
我只能插入/更新付款,以便每次付款都引用有效的 store_id/account_type,它存在于 accounts 表中。
我尝试过但没有真正起作用的可能解决方案:
我尝试将account_type添加到付款中,但随后我将该字段翻了一番 - 当我更改付款类型时,我将不得不通过触发器更改引用的付款。- 但在最好的情况下,我不希望触发器强制执行数据完整性 - 而且我不希望重复数据存储。
我试图在多个表上创建一个外键约束/一个将支付与 payment_types 连接起来的视图。不幸的是,这在 Oracle DBMS 中似乎是不可能的
我试图在 Payments 上创建一个虚拟列,它从 payment_types 计算值,但虚拟列只能引用同一个表中的列。
先说一些注意事项:
考虑到对
Accounts
有unique
限制(account_type, account_store)
,付款似乎只与一个帐户相关联。这表明 FK fromPayments
应该引用Accounts
(而不是Stores
)。此更改还将解决问题 #2。添加
account_type
到Payments
(并相应地修改外键Payment_types
)似乎是最明智的方法,它将解决问题#3。这两项更改将共同解决问题 #1。
Oracle 没有
ON UPDATE CASCADE
选项,因此这个问题(更新 Payment_type 的 account_type 以更新相关的 Payments)需要通过更新触发器或存储过程(还将检查相关 Accounts 是否也存在(或已添加)来解决) 适用于所有具有(更新的)account_type 付款的商店。建议的设计,假设您还有一个
Account_types
表格(我重命名了几列,但这取决于您和您的偏好/约定):请注意两个外键如何
Payments
使用复合键。