pvg*_*ran 7 referential-integrity graph neo4j
任何基于图形/图形感知的数据库(Neo4j、ArangoDB、OrientDB 或其他)是否具有与关系数据库提供的机制相同的维护引用完整性的机制?
我正在探索各种基于文档的数据库,以找到合适的引擎用于向某个项目添加辅助数据存储。
我发现了基于图的/多模型数据库,它们似乎是一个好主意,但我惊讶地发现它们似乎没有提供与现代关系数据库相同级别的关系/链接/边缘保护。
特别是,我正在讨论将实体/顶点的删除与链接/边的删除相链接。在关系数据库中,我可以有一个外键约束,它将一个表中的记录与另一个表中的记录链接起来,并且可以
如果表 A 中的记录被表 B 中的记录引用,则防止删除该记录(“删除时不执行任何操作”),或者
如果删除表 A 中的引用记录,则删除表 B 中的引用记录。
我希望在图形感知数据库中找到类似的机制。例如,如果“评论”顶点链接到“帖子”顶点(形成多对一关系),则需要解决以下问题/挑战:
当该帖子的评论存在边缘时,防止删除该帖子。这样,评论就永远不会有指向帖子的悬空链接/边缘。解决方案是:根据链接/边缘属性,
阻止删除帖子,直到删除该帖子的评论的所有边缘,或者
删除帖子时删除链接到该帖子的所有评论。
防止删除评论到帖子的边缘而不删除评论本身,以防止评论根本没有到帖子的链接/边缘。
仅当创建边缘以同时将此评论链接到帖子时才允许创建评论。
基于图形的数据库中确实缺乏这样的机制,还是我只是找不到它们?
我知道OrientDB有“链接”数据类型,可能解决了第二个问题和第三个问题(如果链接类型属性被声明为强制且非空,那么在不指定链接目的地的情况下不可能创建记录,稍后不可能通过取消设置属性来中断链接)。
然而,据我记得,可以删除链接类型属性指向的记录,从而产生悬空链接(因此第一个问题没有解决)。
我还知道,在某些数据库中,我可以使用嵌套文档作为多个链接文档的替代方案。然而,这种方法不能很好地扩展(对于链接记录数量可以无限增长的情况)。此外,它也非常有限(当需要多个链接时,例如,指向帖子和用户的链接,它不能用作替代方案;还有其他重要的限制)。
小智 0
- 仅当创建边缘以同时将此评论链接到帖子时才允许创建评论。
Dgraph Labs 的开箱即用的 GraphQL 实现对此提供了支持。在您的架构中,您将添加一个感叹号!
来表示添加和检索时需要边缘。
type Post {
id: ID
comments: [Comment]
}
type Comment {
id: ID
text: String!
onPost: Post! @hasInverse(field: comments)
}
Run Code Online (Sandbox Code Playgroud)
上面的模式将要求每个评论都有一个参考onPost
边缘,并且如果您发送不符合此要求的突变,则会返回错误。
如果您要查询评论并请求边缘onPost
但它不存在,这也会出错。如果没有边缘就无法添加评论,那会如何发生?因为@hasInverse
将进行簿记以保持 Post.comments 和 Comment.onPost 边缘一致。这允许您删除可以删除 Comment.onPost 边的帖子节点。
- 当该帖子的评论存在边缘时,防止删除该帖子。
- 防止删除评论到帖子的边缘而不删除评论本身
目前,在 Dgraph 的 GraphQL 实现中,无法像 SQL 类数据库那样强制执行或阻止级联删除。这必须从中间件级别进行管理。话虽如此,Dgraph Labs 目前已经实现了一种使用该指令执行此操作的方法@custom
,并且目前正在开发(承诺在 20.11 版本中发布)@lambda
指令以启用几乎本机的 javascript 中间件功能。将这些方法之一与另一个当前等待发布指令相结合@generate
。生成指令将允许您禁用默认生成的突变,然后您可以创建自己的自定义突变来根据需要使用 DQL 更新插入来处理此业务逻辑。然后可以通过 GraphQL 端点映射和服务这些自定义突变。