我正在努力解决 SQL 数据库模式中的依赖循环问题。情况是这样的:
我有文档、交易、付款方法和更新交易的表格。
交易链接文档和支付方式,并且它们的状态可以更新。
updated_transactions 表存储对交易的建议更新,引用原始交易以及建议更新的文档和付款方式 ID。
问题是外键关系创建了一个循环: 文档 > 交易 > Updated_transactions 文档 >updated_transactions
并且在
payment_methods > 交易 > 更新的交易
付款方式>更新的交易
这里提供了SQL代码供参考:
CREATE TABLE `documents`(
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
);
CREATE TABLE `transactions`(
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`payment_method_id` BIGINT NOT NULL,
`docment_id` BIGINT NOT NULL,
`updated_state` BIGINT NOT NULL
);
CREATE TABLE `payment_methodes`(
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
);
CREATE TABLE `updated_transactions`(
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`updated_payment_method_id` BIGINT NOT NULL,
`updated_docment_id` BIGINT NOT NULL,
`id_transaction` BIGINT NOT NULL
);
有哪些解决方案可以打破这种依赖循环?
对我来说,这看起来像是经典的版本控制问题。
如果我正确理解你的概念描述,那么你的交易条目应该都是不可变的。如果必须将更改应用于事务,则将创建一个新的数据实体。
您的设计看起来比实际情况要复杂一些。
这个怎么样:
main_transaction_id
(BIGINT) 列添加到您的 transactions
表version
(INT) 列添加到您的 transactions
表updated_transactions
的数据迁移到 transactions
表中,然后忘记 TABLE updated_transactions
每当您在语义上创建新事务时,列
main_transaction_id
都会获得与列 id
相同的值。版本获取值 1
。
每当您在语义上创建交易的新版本时,您都可以让 AUTO_INCRMENT 设置
id
列的值,但保留 main_transaction_id
字段不变,因为它已在原始交易条目中设置。不要忘记增加您的版本值。
EG
id | 主要_交易_id | 版本 | ... |
---|---|---|---|
1 | 1 | 1 | ... |
2 | 1 | 2 | ... |
3 | 3 | 1 | ... |
4 | 1 | 3 | ... |
5 | 5 | 1 | ... |
6 | 5 | 2 | ... |
向
created_at
表添加 transactions
DATETIME 列,因为它将帮助您记录交易的相关时间戳,以防出现投诉或维护问题。