问题标签 [referential-integrity]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
mysql - 在尝试删除 MySQL 中的任何这些记录之前,如何检查记录列表的外键引用?
当你有一个记录列表时,有没有办法在你尝试删除这些记录之前检查这些记录中的每一个是否有外键引用?
例如,如果我有一个借阅者列表和一个图书列表,那么如果一个借阅者仍有借阅的图书,那么您应该无法从系统中删除该借阅者。(然而,我的实际系统比这复杂得多 - 更多的表。)
我想从任何有借书的借款人中删除删除选项(在该示例中)。
如果我尝试删除具有外键引用的记录,则会收到以下错误:
数据库访问失败:无法删除或更新父行:外键约束失败 (
dbname
.tablename
, CONSTRAINTfkfieldid
FOREIGN KEY (fieldid
) REFERENCEStablename
(fieldid
))
一种解决方案是编写一个查询来检查记录列表中的每条记录是否在它可能被引用的任何可能的表中具有任何外键引用。
但是,如果我希望在我的内容管理系统中显示一个包含 100 条记录的列表,并且我必须运行 100 个子查询才能显示该列表,这显然是非常低效的!
最终用户在尝试删除记录时会感到困惑,但他们不能,因为该数据在其他地方“正在使用”,所以我宁愿删除删除选项以避免混淆。
关于什么是最好的事情的任何想法?谢谢。
oracle - 去除外键约束、参照完整性和休眠
我的同事提到我们的客户 DBA 提议删除我们项目 Oracle DB 模式中的所有外键约束。起初我不同意这个决定。我是开发人员而不是 DBA。所以后来意识到这个决定背后可能有一些原因。所以我正在尝试了解这个决定的利弊。
项目信息:
- 具有 Hibernate 持久性的 Spring 应用程序。
- 甲骨文 10g 数据库
- 有些批处理作业仅使用 SQL-loader 或普通 JDBC。
这是我的优缺点列表(如果我错了请纠正我)
优点:
由于应用程序持久性由 Hibernate 管理,因此不需要外键级联。它由 Hibernate 使用适当的级联选项进行管理。
Hibernate DELETE 操作(包括删除级联选项)在删除其主键记录之前删除外键表记录(即避免引用完整性问题)。对于无外键情况、外键情况和外键级联情况,此行为是相同的。但是添加外键会不必要地减慢 Oracle 删除操作。
缺点
Hibernate 提供了一种机制来管理对象之间的关联以及关联中的级联操作。但它从来没有提供数据库拥有的完整的参照完整性解决方案。
那些仅使用 SQL-loader 或普通 JDBC 的批处理作业需要参照完整性。
伙计们,我需要你的建议。如果你们中的任何人是 DBA,请提供 DBA 的附加理由。
谢谢你。
database - 具有参照完整性(删除级联)的 NoSQL / RDBMS 混合?
是否有一个数据库可以为您提供参照完整性的好处并能够使用 SQL 类型语言进行查询,但也可以让实体根据其数据属性以及它们之间的关系进行松散定义?
例如,采用具有权限、用户、用户组和角色的 RBAC 类型模型。复杂/灵活的模型可能具有以下规则:
- 角色可以拥有一个或多个权限,并且一个权限可以属于一个或多个角色
- 用户可以拥有一个或多个权限,一个权限可以属于一个或多个用户
- 用户组可以有一个或多个权限,一个权限可以属于一个或多个用户组
- 用户可以拥有一个或多个角色,一个角色可以属于一个或多个用户
- 用户组可以有一个或多个角色,一个角色可以属于一个或多个用户组
- 角色可以有一个或多个角色,一个角色可以属于一个或多个角色
在 RDBMS 中对上述内容进行建模将涉及创建许多交集表。理想情况下,我想在数据库中定义的只是实体本身(用户、角色等)以及一些强制性属性。其他一切都将是动态的(即不需要 DDL),例如,我可以创建一个具有未预定义的新属性的用户。我还可以在尚未预定义的实体之间创建关系,尽管数据库会像普通 RDBMS 一样处理参照完整性。
通过创建一个表来存储实体和另一个表来存储关系等,可以在 RDBMS 中在某种程度上实现上述目的,但这会使执行简单查询所需的 SQL 过于复杂,并且还可能对性能产生影响。
ruby-on-rails - Rails 中的参照完整性
所以,我刚刚发现 Rails 不支持关于外键的参照完整性这一事实,我感到相当惊讶。那么,管理此问题的最佳方法是什么?是否有处理参照完整性的“rails”方式?
理想情况下,应用程序不必处理所有这些;分贝应该。我在看像外国人这样的插件。我想知道这种方法是否有一些缺点。这通常在 Rails 中如何处理?
mysql - MYSQL:无法添加或更新子行:外键约束失败
我收到错误消息:
无法添加或更新子行:外键约束失败 ( mydb/requests
, CONSTRAINT requests_ibfk_5
FOREIGN KEY ( fixture_id
) REFERENCES fixtures
( fix_id
) ON UPDATE CASCADE ON DELETE CASCADE)
我有以下表结构:
如果我更新父表(fixtures)的 fix_id 字段上的记录,在子表(requests)中有一个共享 id(fixture_id),我会收到上述错误。
我不明白为什么这个完整性约束会失败。两个表都已经有了应该级联的正确数据?
非常感谢任何帮助。
database - 是否应该强制执行参照完整性?
不应强制执行参照完整性的原因之一是性能。因为 Db 必须针对关系验证所有更新,所以它只会让事情变慢,但是执行和不执行的其他优点和缺点是什么?
因为无论如何关系都是在业务逻辑层中维护的,所以它只是让 db 做这些事情变得多余。你对此有什么想法?
ruby-on-rails - 参考数据完整性:必要性、可有可无还是旧帽子?
在我看来,像 Rails 这样的框架鼓励将很多逻辑,甚至是约束和外键之类的东西从数据库中移出。变得更好,因为它更易于管理且易于更改。即便如此,一些操作更容易更快,或者只是在 SQL 中才有可能。
最近 MongoDB、Cassandra 等 noSQL 数据库的流行爆炸式增长,更彻底地改变了数据库开发中最佳实践的方法。
我的问题:参考数据完整性不再是必需品吗?
我意识到这通常归结为选择最适合这项工作的工具,但让我们排除金融应用程序和必须拥有交易的类似类型应用程序,并专注于更典型的赚钱但不需要银行级别完整性的应用程序.
参考数据完整性有多必要?有人可以列出他们在不使用它时遇到的一些问题吗?
使用 PostgreSQL 之类的数据库存储更关键的数据,使用 MongoDB 存储不太关键但要求高的数据是明智的策略吗?您如何建议准确定义哪些数据是“关键的”,哪些是“非关键的”?
ruby-on-rails - Rails 是否有工具来验证数据库的引用完整性?
应用程序在更新时有错误或得到错误,有些隐藏在几个月或几年后被检测到,产生孤立的记录,无处指向的键等,即使使用适当的测试套件也是如此。
尽管 Rails 没有在数据库级别强制引用完整性——出于其他地方讨论的一些很好的原因,它将保持这种状态——拥有可以检查数据库是否处于一致状态的工具仍然很好。
由于模型描述了“应该”,离线工具不可能验证所有数据的完整性。它可以在备份数据之前定期运行,或者只是为了开发人员良好的睡眠。
有这样的吗?
mysql - 将多个 MySQL 数据库合并为一个保持参照完整性
我想将具有相同架构定义的众多 MySQL 数据库整合到一个数据库中。如果我从每个数据库中都有一个转储文件,我如何将它们全部导入同一个数据库而不会使它们的主键和外键发生冲突?
有没有一种相当简单的方法可以做到这一点,还是我需要编写一些自定义代码来理解数据并“手动”创建一组合并的记录?
xsd - 没有全局唯一 ID 的 XML 文件中的参照完整性
也许我没有只见树木不见森林,但它是这样的:
我正在“设计”一个 XML 文档,到目前为止,我已经想出了如下内容:
所以这是一个简单的层次结构。我现在想要做的是从一个元素到层次结构中任何其他元素的引用。如果每个元素都有一个唯一的 ID,那将是微不足道的,但他们没有。到目前为止,我只计划保证每个元素的键在其级别内是唯一的(很像目录结构中的文件名)。
换句话说,如果我有完全限定的键,例如root.foo
,保证参照完整性会很简单。但是我会存储冗余信息(我已经知道这foo
是 的子元素root
,为什么要存储该信息两次?)。
我意识到这本质上是一个外观问题。最简单的解决方案之一可能是自动分配 ID 并完成它。但这是相当不优雅的(并且容易出错,除非你有一个很好的前端来编辑文件),所以我希望有一个更好的方法来做到这一点。
有没有办法在 XML Schema 中实现这一点?