首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在两个DB表中使用循环引用是一种好习惯

在两个DB表中使用循环引用不是一个好习惯。循环引用指的是两个表之间相互引用对方的主键作为外键,形成一个循环的关系。这种设计模式会导致数据的一致性难以维护,并且可能引发死锁和性能问题。

循环引用会导致以下问题:

  1. 数据一致性问题:当两个表之间存在循环引用时,更新或删除其中一个表的数据可能会导致数据不一致的情况。例如,删除一个表中的记录可能会导致另一个表中的外键引用无效。
  2. 死锁问题:循环引用可能导致死锁,即多个事务相互等待对方释放资源而无法继续执行。这是因为循环引用可能导致事务之间的依赖关系,当多个事务同时访问这些表时,可能会发生死锁。
  3. 性能问题:循环引用可能导致查询性能下降。当查询涉及到多个表之间的循环引用时,需要进行多次关联操作,增加了查询的复杂性和开销。

为了避免循环引用带来的问题,可以考虑以下解决方案:

  1. 重新设计数据模型:重新审视数据模型,避免循环引用的出现。可以通过引入第三个表来解决循环引用的问题,或者重新定义表之间的关系。
  2. 使用触发器或存储过程维护数据一致性:可以使用触发器或存储过程来处理数据更新和删除操作,确保数据的一致性。
  3. 使用事务管理并发访问:使用事务来管理对表的并发访问,避免死锁问题的发生。
  4. 优化查询性能:对于涉及到多个表的查询,可以考虑使用索引、优化查询语句等手段来提高查询性能。

总结起来,循环引用在数据库设计中不是一个好习惯,会导致数据一致性、死锁和性能问题。为了避免这些问题,应该重新设计数据模型,使用触发器或存储过程维护数据一致性,使用事务管理并发访问,并优化查询性能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

DB笔试面试779】Oracle,SYS.SMON_SCN_TIME基的作用是什么?

♣ 题目部分 Oracle,SYS.SMON_SCN_TIME基的作用是什么?...♣ 答案部分 SYS.SMON_SCN_TIME基用于记录过去时间段SCN与具体的时间戳(timestamp)之间的映射关系,因为是采样记录这种映射关系,所以SMON_SCN_TIME可以较为粗糙地定位某个...实际的SMON_SCN_TIME是一张cluster table簇。SMON_SCN_TIME基的数据是由SMON后台进程来维护的。...Oracle 11g,该的创建SQL$ORACLE_HOME/rdbms/admin/dtxnspc.bsq文件,可以直接查看: create cluster smon_scn_to_time_aux...SMON后台进程会每5分钟被唤醒一次,检查SMON_SCN_TIME磁盘上的映射记录总数,若总数超过144000条,则会使用以下语句删除最老的一条记录(TIME_MP列最小): delete from

61420
  • DB笔试面试669】Oracle,若临时空间使用率过高有什么调优思路?

    题目部分 Oracle,若临时空间使用率过高有什么调优思路?...当SQL语句中使用了诸如ORDER BY、GROUP BY子句时,Oracle服务器就需要对所选取的数据进行排序,这时如果排序的数据量很大,那么内存的排序区(PGA)就可能装不下,所以,Oracle...临时空间中的排序段是实例启动后当有第一个排序操作时创建的,排序段需要时可以通过分配EXTENTS来扩展并一直可以扩展到大于或等于该实例上所运行的所有排序活动的总和。...l DATA:临时(GLOBAL TEMPORARY TABLE)存储数据使用的段。 l INDEX:临时上建的索引使用的段。 l HASH:HASH算法,如HASH连接所使用的临时段。...以上例子,TEMP空间的TS#为3,所以TS#+1=4。如果想清除所有空间的临时段,那么TS#设置为2147483647。

    1.1K30

    数据库基础知识

    我们之所以常常把 DB 等价位 DBMS,是因为我们使用 DBMS 来访问 DBDB 对我们来说是透明的。 一个数据库由一到多个组成。 (table):某种特定类型数据的结构化清单。...结构化:由列、行分割成一个个网格组成。 特定类型:的每条记录将有着相同项,不应将顾客的清单和订单的清单存储一个名:数据库的每个都有一个名字,用来标识自己。...主键通常定义的一列上,但这并不是必需的,也可以一起使用多个列作为主键。使用多列作为主键时,上述条件必须应用到构成主键的所有列,所有列值的组合必须是唯一的(但单个列的值可以不唯一)。...---- 主键的最好习惯 除 MySQL 强制实施的规则外,应该坚持的 几个普遍认可的最好习惯为: 不更新主键列的值; 不重用主键列的值; 不在主键列中使用可能会更改的值。...SQL尽管看上去很简单,但它实际上是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作。

    1.3K50

    delete 后加 limit 是个好习惯

    那么,日常执行 delete 时,我们是否需要养成加 limit 的习惯呢?是不是一个好习惯呢? 日常的 SQL 编写,你写 delete 语句时是否用到过以下 SQL?...10000; 第二种,一个连接循环执行 20 次 delete from T limit 500; 第三种, 20 个连接同时执行 delete from T limit 500。...- END - ---- 在业务场景要求高的数据库,对于单条删除和更新操作, delete 和 update 后面加 limit 1 绝对是个好习惯。...那么,日常执行 delete 时,我们是否需要养成加 limit 的习惯呢?是不是一个好习惯呢? 日常的 SQL 编写,你写 delete 语句时是否用到过以下 SQL?...10000; 第二种,一个连接循环执行 20 次 delete from T limit 500; 第三种, 20 个连接同时执行 delete from T limit 500。

    62730

    delete后加 limit是个好习惯么 ?

    比如,删除执行,第一条就命中了删除行,如果 SQL 中有 limit 1;这时就 return 了,否则还会执行完全扫描才 return。效率不言而喻。...那么,日常执行 delete 时,我们是否需要养成加 limit 的习惯呢?是不是一个好习惯呢? 日常的 SQL 编写,你写 delete 语句时是否用到过以下 SQL?...limit 10000; 第二种,一个连接循环执行 20 次 delete from T limit 500; 第三种, 20 个连接同时执行 delete from T limit 500。...至于选哪一种方案要结合实际场景,综合考虑各个因素吧,比如表的大小,并发量,业务对此的依赖程度等。...比较多的朋友都选择了第二种方式,即:一个连接循环执行 20 次 delete from T limit 500。确实是这样的,第二种方式是相对较好的。

    66710

    delete 后加 limit 是个好习惯么?!

    在业务场景要求高的数据库,对于单条删除和更新操作,删除和更新后加限制1绝对是个好习惯。...这样,删除执行,第一条就命中了删除行,如果SQL中有限制1;这时就return了,否则将会执行完全扫描才ret urn。效率不言而喻。 那么,日常执行删除时,我们是否需要养成加极限的习惯呢?...是不是一个好习惯呢? 日常的SQL编写,您写删除语句时是否用到过以下SQL?...---- 对于删除限制的使用,MySQL大佬丁奇有些道题: 如果您要删除一个表里面的前10000行数据,有以下三种方法可以做到:第一种,直接执行第二种,一个连接循环执行20次从T限制500删除;第三种...比较多的朋友都选择了第二种方式,即:一个连接循环执行20次从T限制500删除。确实是这样的,第二种方式是相对更好的。

    1.1K71

    delete后加limit是个好习惯

    在业务场景要求高的数据库,对于单条删除和更新操作,delete和update后面加limit 1绝对是个好习惯。...比如,删除执行,第一条就命中了删除行,如果SQL中有limit 1;这时就return了,否则还会执行完全扫描才return。效率不言而喻。...那么,日常执行delete时,我们是否需要养成加 limit 的习惯呢?是不是一个好习惯呢? 日常的SQL编写,你写delete语句时是否用到过以下SQL?...10000; 第二种,一个连接循环执行 20 次 delete from T limit 500; 第三种, 20 个连接同时执行 delete from T limit 500; 你先考虑一下...比较多的朋友都选择了第二种方式,即:一个连接循环执行 20 次 delete from T limit 500。确实是这样的,第二种方式是相对较好的。

    68020

    【003期】JavaSE面试题(三):JavaSE语法(1)

    如果我能做到百日百更,希望你也可以跟着百日百刷,一百天养成一个好习惯。 Q: & 和 && 的区别? &运算符有两种用法: 按位与 逻辑与 &&运算符是短路与运算。...Q: Java ,如何跳出当前的多重嵌套循环?...hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个 int 整数。 这个哈希码的作用是确定该对象哈希的索引位置。...hashCode() 定义 JDK 的 Object.java ,这就意味着 Java 的任何类都包含有 hashCode() 函数。...如果没有重写hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据) Q: Java的Math.round(1.5)等于多少?

    38600

    delete后加 limit是个好习惯

    喏 → MySQL专栏目录 | 点击这里 在业务场景要求高的数据库,对于单条删除和更新操作,delete和update后面加limit 1绝对是个好习惯。...比如,删除执行,第一条就命中了删除行,如果SQL中有limit 1;这时就return了,否则还会执行完全扫描才return。效率不言而喻。...那么,日常执行delete时,我们是否需要养成加 limit 的习惯呢?是不是一个好习惯呢? 日常的SQL编写,你写delete语句时是否用到过以下SQL?...limit 10000; 第二种,一个连接循环执行 20 次 delete from T limit 500; 第三种, 20 个连接同时执行 delete from T limit 500...比较多的朋友都选择了第二种方式,即:一个连接循环执行 20 次 delete from T limit 500。确实是这样的,第二种方式是相对较好的。

    54230

    64次更改极限!MySQL DBA如何巧妙规避即时DDL操作的陷阱?

    前言 我们MySQL 8.0.12版本引入了一种新的 DDL 算法,当更改定义时不会阻塞。第一个即时操作是由腾讯游戏团队贡献的--的末尾添加列。...这意味着ALTER语句将只修改数据字典元数据。 DDL 操作的准备和执行阶段不会对表获取独占元数据锁,数据不受影响,使操作瞬间完成。...当指定算法时,如果MySQL无法使用它,它会抛出错误,而不是使用一种算法执行操作: ALTER TABLE t1 DROP col1, ALGORITHM=INSTANT; ERROR: 4092 (...作为DBA,监控所有并决定何时需要重建(以重置计数器)是一个好习惯。...结论 总之,MySQL 8.0入的INSTANT算法通过避免阻塞更改,彻底改变了模式更改。然而,由于有64次即时更改的限制,需要重建之前,明确指定ALTER语句中的算法以避免意外行为至关重要。

    18510

    技术译文 | 为什么 MySQL 添加一个简单索引后大小增长远超预期?

    仅保留必要的索引以降低写入性能和磁盘空间开销是一种众所周知的好习惯。MySQL 官方文档简要提到了这个简单的规则[1] 然而,某些情况下,添加新索引的开销可能远远超出预期!...): $ ls -lh db1/t1.ibd -rw-r----- 1 przemek przemek 508M Jan 22 22:40 db1/t1.ibd 当我们的查询 WHERE 子句中使用列...让我在这里引用文档[2]: InnoDB ,辅助索引的每条记录都包含该行的主键列,以及为辅助索引指定的列。InnoDB 使用此主键值来搜索聚集索引的行。...这解释了为什么重复值并没有完全导致重复空间大小。该工具允许我们使用 GNUplot 很好地说明这一点: 复制主键值的一个重要副作用是列 b 的索引我们的案例是 覆盖索引[5]!...磁盘使用情况的差异可能很大,因此设计时请记住这一点。 出于同样的原因,使用 UUID 作为主键的常见做法会损害性能和存储数据的总体成本。

    21320

    DB笔试面试592】Oracle之间的关联方式有哪几种?

    ♣ 题目部分 Oracle之间的关联方式有哪几种?...(NL) NL是一种比较高效的连接方式,内部循环与外部表相匹配。...嵌套循环连接,Oracle读取驱动(外部的每一行,然后在被驱动(内部检查是否有匹配的行,所有被匹配的行都被放到结果集中,然后处理驱动的下一行。...这种连接是Oracle 7.3入的,从理论上来说比NL与SMJ更高效,而且只用在CBO(Cost Based Optimization,基于代价的优化器)优化器。...这个阶段如果被驱动的连接列的值没有与驱动连接列的值相等的话,那么这些记录将会被丢弃而不进行探测。 这种方式适用于较小的完全可以放于内存的情况,这样总成本就是访问两个的成本之和。

    2.1K10

    delete后加 limit是个好习惯么 ?

    比如,删除执行,第一条就命中了删除行,如果 SQL 中有 limit 1;这时就 return 了,否则还会执行完全扫描才 return。效率不言而喻。...那么,日常执行 delete 时,我们是否需要养成加 limit 的习惯呢?是不是一个好习惯呢? 日常的 SQL 编写,你写 delete 语句时是否用到过以下 SQL?...limit 10000; 第二种,一个连接循环执行 20 次 delete from T limit 500; 第三种, 20 个连接同时执行 delete from T limit 500。...至于选哪一种方案要结合实际场景,综合考虑各个因素吧,比如表的大小,并发量,业务对此的依赖程度等。...比较多的朋友都选择了第二种方式,即:一个连接循环执行 20 次 delete from T limit 500。确实是这样的,第二种方式是相对较好的。

    49130

    Java 流程控制

    选择结构 选择语句又称为分支语句,它通过对给定的条件进行判断,从而决定执行两个或多个分支的哪一支。...switch多选择结构 switch 语句是一种多路判定语句,它判断表达式的值是否与整数或字符常量列表的某个值相匹配。 若找到了相应的匹配,就会执行与常量关联的语句。...for(int i=0;i<xyz_value;i++) 增强for循环 Java5入了ー种主要用于数组戓集合的增强型for循环。...do…while 循环 语法: do { 语句; }while (条件); while后面的分号不能省略。 do…while 循环中,循环的代码条件测试执行前执行一次。...( breaki语句也 switch语句中使用) continue语句用在循环语句体,用于终止某次循环过程,即跳过循环尚未执行的语句,接着进行下一次是否执行循环的判定。

    92420

    Python语言快速入门建议收藏

    【简介】 Python(蟒蛇)是一种动态解释型的编程语言。Python可以Windows、UNIX、MAC等多种操作系统上使用,也可以Java、.NET开发平台上使用。...4 如果需要查看变量的类型,可以使用type类,该类可以返回变量的类型或创建一个新的类型。 5 python有3种表示字符串类型的方式,即单引号、双引号、三号。单引号和双引号的作用是相同的。...python程序员更喜欢用单引号,C/Java程序员则习惯使用双引号表示字符串。三可以输入单引号、双引号或换行等字符。...三号可以用来多行注释见《Pyhton 单行、多行注释符号使用方法及规范》 【运算符和表达式】 见《Python的运算符》 1 python不支持自增运算符和自减运算符。...模块把一组相关的函数或代码组织到一个文件,一个文件即是一个模块。模块由代码、函数和类组成。导入模块使用import语句。 5 包的作用是实现程序的重用。

    57630

    【一天一大 lee】反转字符串 (难度:简单) - Day20201008

    题目: 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。...不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 你可以假设数组的所有字符都是 ASCII 码表的可打印字符。...如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表存在环。为了表示给定链表的环,我们使用整数 pos 来表示链表尾连接到链表的位置(索引从 0 开始)。...抛砖玉 思路 哈希 遍历链表一个节点就将遍历的节点作为哈希存放到(map、set、object) 后续又遇到则说明存在环,否则不存在 /** * Definition for singly-linked...,两个指针一快一慢(每次next是存在间隔) 如果链表内有环,则两个指针一定会在环内相遇(快指针超过慢指针x圈) 如果最终两指针均遇到终点则说明无环 var hasCycle = function (

    28431

    JVM底层—Java Class字节码文件解析

    ; } } ClassTest.class 要想能读懂class文件这种生肉干货,首先要理解.class文件的一些基本概念 基本概念 无符号数& 无符号数是一种基本的数据类型,通常用u1...访问标志之后,紧接着是类索、父类索,共占据4个字节。...字段集合 接口索引集合后的两个字节是fields_count类型,描述的是字段集合内有多少个字段。...字段结构以及字段各结构类型详见【查阅表格】 方法集合 字段集合结束后,接下来的两个字节是method_count类型,描述的是方法集合中有多少个方法。...具体使用方法是cmd输入: javap -verbose 类名 输出结果大致是这样:(以ClassTest.class为例) 查阅表格 常量池类型 所有结构类型 访问标志 字段结构

    39520
    领券