基于有向图的外键冲突解决算法设计与实现

数据库作为存储数据的介质,其包含数量庞大的数据表和复杂的数据关联。为确保数据库中数据的一致性,需要在数据表间定义一些约束关系,并引入外键(foreignkey)概念,用于建立和加强两个表数据之间的链接关系,即通过将表中某一字段或多个字段映射到另一个表中,创建两个表之间的约束关联。目前,采用外键设计的数据库已在传统行业中广泛使用,其优点主要是从数据库底层实现了数据的完整性和一致性,软件底层数据库开发与软件应用层开发相对透明,上层应用开发人员无需完全了解数据库设计规约。随着大数据时代的到来,互联网的数据容量呈现指数级增长,传统行业的应用软件逐渐转向互联网应用模式。由于外键字段执行写入操作时,需实现外键约束逻辑,对涉及外键校验的数据表加同步锁。如果写入操作不按照某种顺序执行,则造成外键校验不通过。因此,互联网行业应用不推荐使用外键。例如,数据表A关联数据表B,在用户执行写入操作时,新增表A数据的操作应在新增表B数据的操作之后,删除表A数据的操作应在删除表B的操作之前。

为满足大数据时代用户新需求,需要将通过客户端访问的模式转向通过浏览器访问的模式。数据表的数据量逐渐扩增且存在极为复杂的多表多字段外键依赖关系。在搭建数据库集群实现数据同步过程中,极易出现因外键冲突导致同步业务困难问题。如果重新设计底层数据库结构,消除已有外键依赖的数据表必然大幅增加开发成本。传统的解决方法是通过递归暴力查找外键冲突,此方法需反复访问数据库来查找外键依赖,造成IO操作频繁,影响了整体业务的性能。

本文提出一种外键关联有向图模型算法,将数据表之间的外键关系以有向图的形式展现,方便分析造成外键冲突的原因。根据数据库提供的SQL语句实现有向图生成算法,并将有向图转化为邻接矩阵,为解决外键冲突提供元数据。在此基础上,提出以邻接矩阵作为输入数据、以拓扑排序算法作为数据处理方法的原子性序列生成算法,解决外键冲突问题。

数据表外键依赖关系转化为有向无环图方法的步骤如下:

步骤1获取数据库的数据表集合T={ta,tb,tc,td,te},令T=V。

步骤2获取ti.fk与tj.rfk,得到Reference(ti.fk,tj.rfk)。

步骤3令ei=Reference(ti.fk,tj.rfk),即一条从ti指向tj的有向边,构建G(V,E)。

步骤4由数据库的外键约定可知,外键不存在循环依赖,即不存在环,G=DAG。

根据1.1节给出的将数据表之间的外键关联转换为有向图模型方法,DAG可以直观地展现外键依赖关系,但是DAG不能直接作为应用程序的输入数据交给计算机处理。因此,通常会将DAG转化为邻接矩阵,以方便数据存储和外键冲突解决处理。本节的主要研究工作集中在如何通过程序执行SQL语句获取T和Reference数据,以及设计并实现将外键依赖关系转化为邻接矩阵的方法。以oracle数据库为例,将DAG转化为邻接矩阵的SQL代码如下:

输入待执行写入操作的数据表ta

输出邻接矩阵表

1.begin

2.selectdistinctparent,child

3.fromuser_constraints//step1

4.innerjoinuser_constraints//step2

5.onr_constraint_name=constraint_name

6.where(constraint_type='fk'

7.orconstraint_type='rfk')//step3

8.connectbyparent=priorchild//step4

9.startwithparent='ta'//step5

10.end

本文的研究重点在于如何通过SQL语句生成邻接矩阵,该SQL语句的详细功能如下:

4)确定存在外键依赖的表,将无向图转为有向图。其中,connectby表示将每一行的数据按链式的层次关系检索,prior关键字表示指针的指向,放置在连接关系两列中的某一列,prior所在的一侧表示入度,另一侧表示出度。

5)用startwith关键字来标识查找图型结构的起始节点,需要执行写入操作的起始节点,即程序的输入。

根据外键有向图模型,分析写入操作的执行顺序可得出以下结论:执行插入操作需满足插入节点的出度为0;执行删除操作需满足删除节点的入度为0;更新操作可视为插入新数据,且删除旧数据。更新前的数据为删除的旧数据,更新后的数据为插入新数据。

步骤1指定用户需要执行写入操作数据表为起始节点。

步骤2从当前节点开始,访问该节点,并标记该节点为已访问过的节点,防止递归回溯出现重复访问。

步骤3判断该节点是否存在未被访问的子节点,若无,则执行步骤4,若有,则判断未被访问的节点入度是否为0。若入度为0,则访问该子节点,跳转到步骤2,否则执行步骤5。

步骤4如果该节点为根节点,则访问完毕,否则执行步骤3。

步骤5标记该节点的入度为1,跳转到步骤3。

实验硬件环境采用IntelCoreTMi5-9400CPU@2.9GHz、16GBDDR5内存和2TB机械硬盘;软件环境采用MicrosoftWindows10操作系统oracle数据库、JavaDevelopmentkit8开发工具包、NaviCat数据库可视化工具、jprofiler性能测试工具和IntelliJIDEA开发工具等。

实验将CPU利用率和内存消耗作为性能评估依据。CPU利用率是反映系统忙闲程度的指标。CPU利用率稳步上升,且数值不会过高,表明程序运行状态良好。当CPU利用率在某一时刻开始下降时,表明IO线程开始执行访问数据库,占用了CPU线程的工作;内存消耗是反映系统资源占用情况的指标。内存占用越高,表明程序运行过程中资源占用越多。当内存在某一时刻开始减少,表明jvm的垃圾回收线程开始工作,清理程序运行中不需要使用的资源。垃圾回收线程工作需要暂停CPU线程的正常运行。若CPU利用率和内存消耗出现频繁的抖动现象,则表明CPU线程处于阻塞状态,应用程序会出现明显的卡顿,影响用户体验。

为验证算法的准确性与泛化性,本文实验在不同的数据库应用场景下,对本文算法和传统算法进行性能比较。实验1为某学校的OA系统,实验采集了该管理系统的20张表,表中的数据主要为文本格式,有5张存在外键冲突的数据集;实验2为某公司的业务数据管理系统集群,实验采集了该数据库的20张表,表中的数据主要为文本和图片格式,有100张存在外键冲突的数据集;实验3为某公司的分布式多媒体文件存储系统,实验采集了该数据库的500张表,表中的数据主要为音频和视频格式,有200张存在外键冲突的数据集。

THE END
1.数据结构图拓扑排序哔哩哔哩数据结构 图 拓扑排序小马xiao_ma 立即播放 打开App,流畅又高清100+个相关视频 更多7122 3 42:51 App 数据结构复习——图 2.4万 43 6:37 App 哈弗曼编码讲解 2.9万 43 7:34 App 深度优先和广度优先搜索 7万 30 4:43 App 数据结构大题—哈希查找,拉链法和线性探测法构造哈希表并求平均查找长度,https://m.bilibili.com/video/BV1aK41197t6
2.浅谈什么是图拓扑排序那么如何合理的分配资源才能保证工程能够按时完成呢?将任务作为图的顶点,将任务之间的依赖关系作为图的边,这样就可以将实际问题抽象为数据结构图论中的典型问题——图的拓扑排序。 2 重要概念 有向无环图(Directed Acyclic Graph, DAG)是有向图的一种,字面意思的理解就是图中没有环。常常被用来表示https://blog.csdn.net/kexuanxiu1163/article/details/89838375
3.对如下所示的有向图进行拓扑排序,得到的拓扑序列可能是()314265或314625两种情况 https://www.nowcoder.com/questionTerminal/35a856102dcc4c3fbe35ab4581af2b93
4.拓扑排序(有向图和无向图),判断是否有环,有算法思路,代码拓扑排序(有向图): 从AOV网中选择一个入度为0的顶点输出,然后删去该顶点,并删除以此顶点为弧尾的弧,重复这个步骤,知道输出图中全部的顶点,或者找不到入度为0的顶点 如果这个图的全部顶点被输出,说明不存在回路的AOV网,否则,存在回路 拓扑排序可以不唯一 https://www.jianshu.com/p/9bf83a799550
5.对图所示的有向图进行拓扑排序,可以得到不同的拓扑序列的个数是百度试题 题目对图所示的有向图进行拓扑排序,可以得到不同的拓扑序列的个数是( )。 A.4B.3C.2D.1相关知识点: 试题来源: 解析 B 反馈 收藏 https://easylearn.baidu.com/edu-page/tiangong/bgkdetail?id=514f9bf7941ea76e58fa04c0&fr=search
6.C++详细讲解图的拓扑排序C语言拓扑排序只适用于 AOV网 (有向无环图)若图中有环,则一定不存在拓扑序。可以证明,一个有向无环图,一定存在一个拓扑序列。有向无环图,又被称为拓扑图。入度: 即有多少条边指向自己这个节点。出度: 即有多少条边从自己这个节点指出去。二、算法流程算法流程:https://www.jb51.net/article/249850.htm
7.对有向图进行拓扑排序的方法是:(1)初始时拓扑序列为空;(2)任意(3)重复(2),直到不存在入度为0的顶点为止(若所有顶点都进入拓扑序列则完成拓扑排序,否则由于有向图中存在回路无法完成拓扑排序)。 函数int* TopSort(LinkedDigraph G)的功能是对有向图G中的顶点进行拓扑排序,返回拓扑序列中的顶点编号序列,若不能完成拓扑排序,则返回空指针。其中,图G中的顶点从1开始依次编号,顶https://www.cnitpm.com/st/3809416600.html
8.拓扑排序问题一个有向图具有有序的拓扑排序序列,那它的邻接矩阵拓扑排序问题一个有向图具有有序的拓扑排序序列,那它的邻接矩阵必定为什么?比如A→B→C这个序列我画出来是0 1 00 0 10 0 0不是三角矩阵啊 扫码下载作业帮搜索答疑一搜即得 答案解析 查看更多优质解析 解答一 举报 左下三角都是0,即上三角矩阵. 解析看不懂?免费查看同类题视频解析查看解答https://qb.zuoyebang.com/xfe-question/question/0065f0efa300bace99a5ae3a8ee0a9bc.html
9.2006年下半年全国自考(数据结构)真题试卷自考int n,e; //图的当前顶点数和弧数 }ALGraph //邻接表类型 下列算法f33的功能是,对以邻接表表示的有向图进行拓扑排序。 (1)阅读算法f33,并在空缺处填入合适的内容,使其成为一个完整的算法; (2)对于如图所示的邻接表,将执行算法f33后的topo[]结果填入给定的数组中。 https://www.educity.cn/zikao/74140.html
10.算法如何确定图(Graph)里有没有环(Cycle)?“判断一个无向图有没有环”的方法本文中就有三个。这里,我们先取第一种方法:拓扑排序判断无向图是否有环。这种方法的描述如下: 使用拓扑排序可以判断一个无向图中是否存在环,具体步骤如下: 1. 求出图中所有节点的度。 2. 将所有度 <= 1 的节点入队。 3. 当队列不空时进入循环,弹出队首元素,把与队https://cloud.tencent.com/developer/article/1825193
11.C++图系列之有向无环图的拓扑排序算法可以使用拓扑排序算法验证AOV网结构的合理性。 拓扑排序算法的思想: 这里的排序并不是指递增或递减式的排序,而是通过算法把有向无环图中的顶点以线性序列方式输出。如果AOV网中的所有顶点都出现在它的线性序列中,则说明此AOV网不存在环,或说拓扑排序算法可以检查图是否有环。 https://zhuanlan.zhihu.com/p/674192824
12.图论(四)图的拓扑排序51CTO博客那么对于AOV网络的拓扑排序怎么做呢? (1)选择入度为零的顶点(从顶点引出的边箭头全部都是向外的)并输出。 (2)删除该顶点及该顶点发出的所有边。 (3)重复步骤(1)和(2),直到找不到入度为0的顶点。 按照上面这样的方法,就叫做拓扑排序,其结果有两种情形: https://blog.51cto.com/sbp810050504/901022
13.4.4图的基本应用及其复杂度分析每日一练● 设有向图有n个顶点和e条边,进行拓扑排序时,总的计算时间为(4)。 (4)A.O(n ) B.O(en) C.O(e ) D.O(n+e) ● 以下哪个是有向图图4-10的拓扑排序序列(5)。 (5)A.ABCDE B.ACDEB C.ABDCE D.ACBED ●图4-10所示的有向图所有拓扑排序序列有(6)个。 https://www.kaoyan.com/kaoyan/05/329379/
14.数据结构考试复习题库=NULLB.p==NULLC.P->next==headD.P==head【答案】C从一个具有n个结点的单链表中查找其值等于 x结点时,在查找成功的情况下,需平均比拟 ()个结点.A.nB.n/2 C.(n-1)/2 D.(n+1)/2【答案】D在有向图的顶点的拓扑序列中,如果 Vi在Vj之前,那么以下情况一定不会出现的是 ().A.图中有弧<V,https://www.renrendoc.com/paper/232819760.html