是否有一个数据库可以提供参照完整性的好处,并且能够使用SQL类型语言进行查询,还可以根据数据属性以及它们之间的关系来松散地定义实体吗?
例如,采用RBAC类型模型,您可以在其中拥有权限,用户,用户组和角色.复杂/灵活的模型可以具有以下规则:
在RDBMS中对上述模型进行建模将涉及创建大量交集表.理想情况下,我想在数据库中定义的只是实体本身(用户,角色等)以及一些强制属性.其他所有内容都是动态的(即不需要DDL),例如,我可以创建一个具有未预定义的新属性的用户.我还可以在尚未预定义的实体之间创建关系,尽管数据库将像普通RDBMS一样处理引用完整性.
通过创建一个存储实体的表和另一个存储关系等的表,可以在某种程度上在RDBMS中实现上述目的,但这会过度复杂化执行简单查询所需的SQL,并且还可能具有性能影响.
database rdbms referential-integrity nosql object-oriented-database
我有一个有3列的表:
ID, PARENT_ID, NAME
Run Code Online (Sandbox Code Playgroud)
PARENT_IDID在同一个表中具有外键关系.该表正在为层次结构建模.
有时ID记录会改变.我希望能够更新记录ID,然后更新依赖记录' PARENT_ID以指向新记录ID.
问题是,当我尝试更新ID记录时,它会破坏完整性并立即失败.
我意识到我可以使用new插入一个新记录ID,然后更新子项,然后删除旧记录,但是我们有很多触发器,如果我这样做会搞砸.
有没有办法暂时更新父级,承诺更新子级(显然它会在提交时失败)而不会短暂禁用外键?
我理解需要具有参照完整性以限制条目中的特定值,或者可能在删除请求时阻止它们被删除.但是,我不清楚一个有效的用例,它会排除这种机制永远被使用.
我想这会涉及几个子问题:
思考?
sql database referential-integrity schema-design database-schema
如果任何行引用要通过FK删除的行,则无法删除行.
在执行DELETE语句之前,是否可以知道是否有任何行引用要删除的行?
鉴于架构:

我需要的是每个user_identities.belongs_to参考文献users.id.
同时,每个users都有一个primary_identity如图所示.
但是,当我尝试添加此引用时ON DELETE NO ACTION ON UPDATE NO ACTION,MySQL说
#1452 - 无法添加或更新子行:外键约束失败(
yap.#sql-a3b_1bf,CONSTRAINT#sql-a3b_1bf_ibfk_1FOREIGN KEY(belongs_to)REFERENCESusers(id)ON DELETE NO ACTION ON UPDATE NO ACTION)
我怀疑这是由于循环依赖,但我怎么能解决它(并保持参照完整性)?
首先,抱歉我的英语不好......
我有四个实体:用户,应用程序,捆绑和实体.以下是他们的关系(级联持续和删除,请参阅下面的代码):
它工作正常.但是用户可以将他的两个实体作为默认实体,我需要直接访问它们.
所以我添加用户两个字段,entity1和entity2,具有1-1关系.现在我的应用程序崩溃了:
An exception occurred while executing 'DELETE FROM bundle WHERE id = ?' with params {"1":13}:
SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`misc`.`entity`, CONSTRAINT `FK_E284468F1FAD9D3` FOREIGN KEY (`bundle_id`) REFERENCES `bundle` (`id`))
Run Code Online (Sandbox Code Playgroud)
我尝试了几件事,包括在这篇文章中创建的那些,但我无法解决它.
欢迎提出任何帮助,谢谢.
编辑:我需要指出User-> Entity关系是optionnal:User的entity1和entity2可以为null.即使它们都为空,也会发生错误.
这是我的实体定义:
# User :
/**
* @ORM\OneToMany(targetEntity="\sfCommands\ContentBundle\Entity\Application", mappedBy="user", cascade={"remove"}, orphanRemoval=true)
* @ORM\OrderBy({"name" = "ASC"})
*/
protected $applications; …Run Code Online (Sandbox Code Playgroud) 我是CouchDB的新手并且了解它.我没有遇到CouchDB对参照完整性的支持.我们可以在CouchDB文档中为字段创建外键吗?
例如,是否可以确保供应商数据库中提供订单文档中使用的供应商名称?
CouchDB是否支持参照完整性?是否可以将文档中的字段作为主键?
我正在设计一些将共享2或3个数据库表的应用程序,所有其他表将独立于每个应用程序.共享数据库主要包含用户信息,可能会出现需要共享其他表的情况,但这是我的本能.
我倾向于所有应用程序解决方案的一个数据库,因为我希望具有参照完整性,并且我不必在每个数据库中保持最新的相同信息,但我可能会以100多个表的数据库,其中只有十个表的组将具有相关信息.
每种应用程序方法的数据库可以帮助我保持一切更有条理,但我不知道如何使所有数据库中的相关表保持最新.
所以,基本问题是:你推荐哪两种方法?
谢谢,
豪尔赫·巴尔加斯
编辑1:
当我谈到不能具有引用完整性时,这是因为当这些表位于不同的数据库中时,没有办法在表中使用外键,并且每个应用程序中至少有一个表需要一个外键来共享其中一个表表.
编辑2:
相关问题的链接:
只有第二个人有一个接受的答案.还没有决定做什么.
回答:
我决定使用每个应用程序的数据库,对共享数据库进行跨数据库引用,为每个数据库添加视图,模仿共享数据库中的表,并使用NHibernate作为我的ORM.作为会员系统,我将使用asp.net.
我还将使用触发器和逻辑删除尝试并保持在没有父母的情况下在livin'la vida loca周围飞行的ID的数量最少.保持数据库同步所需的开发工作太多而且收益太少(正如你们所指出的那样).所以,我宁愿通过孤立的记录来战斗.
由于使用ORM和视图是由svinto首先提出的,他得到了正确的答案.
感谢所有人帮助我做出这个艰难的决定.
database architecture sql-server database-design referential-integrity
我已经阅读了Bill Karwin关于单表继承的一些答案,并认为这种方法对我正在考虑的设置有好处:
Playlist
--------
id AUTO_INCREMENT
title
TeamPlaylist
------------
id REFERENCES Playlist.id
teamId REFERENCES Team.id
UserPlaylist
------------
id REFERENCES Playlist.id
userId REFERENCES User.id
PlaylistVideo
-------------
id
playlistId REFERENCES Playlist.id
videoId REFERENCES Video.id
Run Code Online (Sandbox Code Playgroud)
所有CASCADE选项都设置DELETE为在Playlist删除a时正常工作,但是,如果删除User或Team删除会发生什么?
即.如果User被删除,在行UserPlaylist会被删除,但被引用的行中Playlist,并PlaylistVideo仍将保留.我考虑过强制执行此操作,TRIGGER AFTER DELETE但无法知道删除请求是否因为Playlist已删除或删除而导致User.
在这种情况下,强制执行诚信的最佳方法是什么?
编辑(提供ERD)

mysql referential-integrity single-table-inheritance polymorphic-associations cascading-deletes
如果我定义表a并b如下:
CREATE TABLE a(i integer);
ALTER TABLE a ADD CONSTRAINT pkey_a PRIMARY KEY (i);
CREATE TABLE b(j integer);
ALTER TABLE b add CONSTRAINT fkey_ij FOREIGN KEY (j)
REFERENCES a (i) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE CASCADE;
INSERT INTO a(i) VALUES(1);
Run Code Online (Sandbox Code Playgroud)
然后执行以下操作:
START TRANSACTION;
SET CONSTRAINTS ALL DEFERRED;
INSERT INTO b(j) VALUES(2);
INSERT INTO a(i) VALUES(2);
COMMIT;
Run Code Online (Sandbox Code Playgroud)
它产生以下错误.为什么SET CONSTRAINTS没有达到预期的效果?
错误:表"b"上的插入或更新违反外键约束"fkey_ij"
SQL状态:23503详细信息:表"a"中不存在键(j)=(2).
sql postgresql database-design referential-integrity foreign-keys
sql ×5
database ×3
foreign-keys ×2
mysql ×2
sql-server ×2
architecture ×1
cascading ×1
couchdb ×1
doctrine-orm ×1
nosql ×1
oracle ×1
postgresql ×1
rdbms ×1
symfony ×1
t-sql ×1