问题标签 [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.
sql-server-2005 - 防止插入额外的子行
我的应用程序涉及使用将表单中的数据(“请求”)提交到 SQL Server 2005 数据库,以供主管稍后审查和批准。用户应该有权插入新请求,但不能修改他们已经提交的请求。
对于单个表,这很简单:只授予他们 INSERT 权限而不授予 UPDATE 权限。但是请求实际上跨越了两个表,具有一对多的关系。我需要防止用户为现有请求插入额外的子行。理想情况下,这应该在数据库级别强制执行:允许在同一事务中插入父行和一个或多个子行,但是一旦提交该事务,就禁止使用该外键插入新的子行。
实现这一目标的最佳方法是什么?有没有办法在没有触发器的情况下强制执行这种特殊的“参照完整性”?如果触发器是唯一的方法,那么我如何测试父行是否已插入当前事务中?
sql - 什么时候参照完整性不合适?
我理解需要具有参照完整性,以限制输入时的特定值或可能阻止它们在删除请求时被删除。但是,我不清楚是否有一个有效的用例会将该机制排除在始终使用之外。
我想这将分为几个子问题:
- 什么时候参照完整性不合适?
- 包含多个和/或可能不完整的外键列表子集的字段是否合适?
- 通常,这应该是模式结构设计决策还是界面设计决策?(或者可能两者都没有或两者都有)
想法?
database - 数据库触发器/参照完整性和内存缓存
您是否看到以更改数据库中实际数据的方式使用数据库触发器/引用完整性规则(更改表 x 中的行 w 会导致表 z 中的行 y 发生更改)?
如果是的话,这与内存缓存(memcache 和朋友)的日益普及有何关联?毕竟,这些操作发生在数据库内部,但缓存系统必须知道它们才能反映正确的状态(或至少使可能更改的状态无效)。我很难相信回调是针对这种情况实施的。
有没有人有这种设置的实际经验/考虑这种设置并放弃它的实际经验(你走哪条路?如果缓存,你如何强制执行完整性?)
database - 在 Cassandra 中建模 M:M 关系的替代方法是什么?
考虑需要在 Cassandra 数据存储中表示的 M:M 关系。
有哪些 M:M 建模选项可用?对于每种选择,什么时候更喜欢?您在 Cassandra 支持的项目中做出了哪些 M:M 建模选择?
sql-server - 用约束建模多对一?
我正在尝试为电影分类创建一个数据库模型,其中每部电影都可以从多个评级系统(例如 BBFC、MPAA)中的每一个中获得一个分类。这是当前的设计,包含所有隐含的 PK 和 FK:
问题在于MovieClassification
表的约束条件将允许来自同一系统的多个分类,而理想情况下它应该只允许来自给定系统的零或一个分类。
考虑到以下要求,是否有任何合理的方法来重组它,以便从任何给定系统中精确地具有零或一个分类的电影由数据库约束强制执行?
- 不要复制可以查找的信息(即
ClassificationSystemId
在MovieClassification
表中复制不是一个好的解决方案,因为这可能与表中的值不同步Classification
) - 保持可扩展到多个分类系统(即一个新的分类系统不需要对表结构进行任何更改)?
还要注意该Advice
列 - 电影到分类的每个映射都需要有一个文本描述,说明为什么将该分类给予该电影。任何设计都需要支持这一点。
sql-server - 每个应用程序的数据库 VS 一个用于所有应用程序的大数据库
我正在设计一些应用程序,它们将共享 2 或 3 个数据库表,并且所有其他表将独立于每个应用程序。共享数据库主要包含用户信息,可能会出现需要共享其他表的情况,但这是我的直觉。
我倾向于为所有应用程序解决方案提供一个数据库,因为我希望具有引用完整性,并且我不必在每个数据库中保持相同的信息是最新的,但我可能会以一个结束包含 100 多个表的数据库,其中只有十个表的组将具有相关信息。
每个应用程序的数据库方法帮助我保持一切更有条理,但我不知道如何让所有数据库中的相关表保持最新。
因此,基本问题是:您推荐两种方法中的哪一种?
谢谢,
豪尔赫·巴尔加斯。
编辑1:
当我谈到不能具有参照完整性时,这是因为当这些表位于不同的数据库中时,无法在表中拥有外键,并且每个应用程序中至少有一个表需要一个外键来连接其中一个共享表表。
编辑2:
相关问题的链接:
只有第二个有一个接受的答案。还没有决定要做什么。
回答:
我决定为每个应用程序使用一个数据库,其中包含对共享数据库的跨数据库引用,向每个数据库添加视图以模仿共享数据库中的表,并使用 NHibernate 作为我的 ORM。作为会员系统,我将使用 asp.net 之一。
我还将使用触发器和逻辑删除来尝试将我在没有父母的情况下飞来飞去的 ID 数量保持在最低限度。保持数据库同步所需的开发工作太多而回报太少(正如你们都指出的那样)。所以,我宁愿在孤儿唱片中奋力拼搏。
由于 svinto 首次建议使用 ORM 和视图,因此他得到了正确答案。
感谢大家帮助我做出这个艰难的决定。
asp.net - SQL Server 2005 是否将错误消息编号传递回 asp.net 应用程序?
我想在执行错误查询时从 SQL Server 获取消息编号和严重性级别信息。
例如,当用户尝试删除被另一条记录引用的行,并且级联关系为“无操作”时,我希望应用程序能够检查错误消息 547(“DELETE 语句与REFERENCE 约束...") 并向用户返回用户友好和本地化的消息。
直接在 SQL Server 上运行此类查询时,将打印以下消息:
在 Asp.Net 应用程序中,此信息是否在事件处理程序参数或其他地方可用?
另外,我想没有人知道我在哪里可以找到 SQL Server 消息编号的明确参考?
mysql - Zend Framework - 数据库表递归级联删除问题
我的情况可能有点不正常,但我在 MySQL 数据库中定义了外键,同时在Zend_Db_Table
类中强制引用完整性。这些表使用 InnoDB 存储引擎。
删除记录时,Zend 框架将通过$_referenceMap
表模型中的 正确识别直接子级并删除它们。但是,如果有直接孩子的任何孩子,我会从数据库中收到关于违反该外键的引用完整性的错误:SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails
. 似乎Zend_Db_Table_Abstract
没有以递归方式强制执行引用完整性。
有人遇到过这种情况么?它是Zend 框架的错误吗?解决方法?修复?
更新
将近一周后,我没有回答这个问题。我想我必须自己扩展Zend_Db_Table_Row_Abstract
课程来完成这个。
sql - 如何在不禁用外键约束的情况下在事务中短暂破坏参照完整性?
我有一个包含 3 列的表:
PARENT_ID
与同一张表有外键关系ID
。该表正在对层次结构进行建模。
有时ID
记录会改变。我希望能够更新记录ID
,然后更新依赖记录PARENT_ID
以指向新的ID
.
问题是,当我尝试更新ID
记录时,它会破坏完整性并立即失败。
我意识到我可以用 new 插入一条新记录ID
,然后更新子项,然后删除旧记录,但是我们有很多触发器,如果我这样做会搞砸。
有没有办法临时更新父级并承诺更新子级(显然它会在提交时失败)而不会短暂禁用外键?
sql-server - 删除触发器作为“ON DELETE CASCADE”的替代品以避免“多级联路径”?
下表定义:
在 sql server 中是不可能的,因为有多个级联路径。
我想让我们创建没有ON DELETE CASCADE
on 列的 OrderDetails order
,让我们看看在删除带有触发器的订单时是否可以强制引用完整性:
触发器在 Orders 中删除后触发,因此不可能(DELETE 语句与 REFERENCE 约束冲突)。
我认为问题出在模型设计上,从 OrderDetails 到客户的参考是一个糟糕的设计。但是,否则可以为属于不同客户的订单创建 OrderDetails。
两个问题:
- 什么是最好的模型设计?
- 仍然可以使用触发器吗?
编辑:我从 OrderDetails 中删除了对客户的引用,这没有任何意义。这解决了所有问题。