gpt4 book ai didi

database - 更新关系数据的算法

转载 作者:搜寻专家 更新时间:2023-10-30 20:00:59 25 4
gpt4 key购买 nike

已知哪些算法可以在存在数据库约束的情况下通过插入、更新和删除行来执行更新数据库的任务?
更具体地说,假设要删除的行的图像之前、要插入的行的图像之后以及要更新的行的图像都在内存中。行可能用于多个表。一个确切的更新序列要么是未知的,要么是尚未保留的——只有数据库最终必须反映的前图像和后图像是已知的。
数据库包含主键、外键和唯一索引约束。问题是找到使数据库更新的命令序列。为了简单起见,我愿意指定永远不会修改行的主键。
数据库系统不支持延迟约束检查。(对于这样的数据库,解决方案很简单)。我还必须制定一个规则,即主键列在插入后不能更新,并且不允许删除行并使用相同的主键重新插入行,即使某些算法可能会发现这样做很方便。(对于数据库系统自动生成所有主键的常见情况,这是必需的。)
算法是什么:
假设外键约束必须始终强制执行,但不使用唯一索引。
假设外键约束和唯一索引约束必须始终强制执行。
我要求两者都有,因为我认为1可能要简单得多。
编辑:这里的目标是以一种通用(或几乎通用)的方式解决缺少延迟约束检查的问题。我想高质量的orm包必须做到这一点。
我想要一个算法的解释,你可以在这里提供,也可以在学术论文等外部提供。我不认为指向软件包或源代码的指针是对这个问题的回答。
朴素算法:
循环遍历表,并为添加、更改或删除的每一行分别生成一条INSERT、UPDATE或DELETE语句。
遍历生成的语句并应用于数据库。如果一个语句不适用,请继续其他语句。
请重试失败的语句。继续迭代,直到没有更多的失败或pass成功执行任何语句。
如果语句仍然存在,请尝试临时调整有问题列中的数据,以使其成功。
这是一个丑陋的蛮力算法,找出“临时调整”部分是一个自己的挑战。所以,我想要一个改进的完整算法。
编辑2:
rbarryyoung发布了一个答案,该答案接近(但没有雪茄)完全解决方案1,同时解决最常见的方案2问题。下面是一个scenario 1更新模式的例子,我在应用程序中经常看到,但还没有找到解决方案。在scenario 1中,delete/update-insert在很多时候都是正确的,但诀窍是找出何时偏离它。我还怀疑偏离它会放大每个场景2出现的独特问题,可能也会增加我解决场景2的兴趣。
请注意,没有周期,也没有修改任何主键。但是,父项的外键将被修改。

CREATE TABLE A
(
AId INT NOT NULL PRIMARY KEY
)

CREATE TABLE B
(
BId INT NOT NULL PRIMARY KEY,
AId INT NOT NULL FOREIGN KEY REFERENCES A (AId)
)

CREATE TABLE C
(
CId INT NOT NULL PRIMARY KEY,
AId INT NOT NULL FOREIGN KEY REFERENCES A (AId),
BId INT NOT NULL FOREIGN KEY REFERENCES B (BId)
)

图像之前:
A (1)
B (1,1)
C (1,1,1)

图像之后:
A (1)
B (2,1) [To be deleted: (1,1)]
C (1,1,2)

排序顺序:A、B、C
第一个命令是delete b(1,1),由于c(1,1,1)而失败。
请注意,如果C中的第三列允许空值(在本例中它不允许空值),纯解决方案可能涉及在早期过程中将其取消,因为这将允许给定算法正常进行,并且在处理大多数方案2问题时具有其通常的优势。一个很好的解决这个问题的方法也需要考虑到这一点。这个问题的全部概括性无疑是一个迷人的问题。

最佳答案

你为什么要这么做?正确的方法是让数据库引擎在提交事务之前推迟对约束的检查。
你提出的问题在一般情况下是难以解决的。如果只考虑要在数据库中更新的行中外键的传递闭包,那么只有在图描述树的地方才能解决这个问题。如果图中有一个循环,您可以通过将外键值替换为空来中断该循环,然后您可以重新编写一个sql并添加另一个sql以在以后更新该列。如果不能用空值替换键值,则无法求解。
正如我所说,正确的方法是关闭约束,直到所有sql都运行完毕,然后在提交时重新打开它们。如果不满足约束,提交将失败。postgres(例如)有一个特性使得这非常简单。

关于database - 更新关系数据的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1082630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com