Database 具有引用完整性的NoSQL/RDBMS混合(删除级联)?

Database 具有引用完整性的NoSQL/RDBMS混合(删除级联)?,database,nosql,rdbms,referential-integrity,object-oriented-database,Database,Nosql,Rdbms,Referential Integrity,Object Oriented Database,是否有一个数据库可以为您提供引用完整性的好处,并能够使用SQL类型的语言进行查询,但也可以根据实体的数据属性以及它们之间的关系松散地定义实体 例如,采用RBAC类型的模型,您拥有权限、用户、用户组和角色。复杂/灵活的模型可以有以下规则: 角色可以有一个或多个权限,并且权限可以属于一个或多个角色 用户可以拥有一个或多个权限,并且权限可以属于一个或多个用户 用户组可以具有一个或多个权限,并且权限可以属于一个或多个用户组 用户可以有一个或多个角色,并且一个角色可以属于一个或多个用户 用户组可以有一个

是否有一个数据库可以为您提供引用完整性的好处,并能够使用SQL类型的语言进行查询,但也可以根据实体的数据属性以及它们之间的关系松散地定义实体

例如,采用RBAC类型的模型,您拥有权限、用户、用户组和角色。复杂/灵活的模型可以有以下规则:

  • 角色可以有一个或多个权限,并且权限可以属于一个或多个角色
  • 用户可以拥有一个或多个权限,并且权限可以属于一个或多个用户
  • 用户组可以具有一个或多个权限,并且权限可以属于一个或多个用户组
  • 用户可以有一个或多个角色,并且一个角色可以属于一个或多个用户
  • 用户组可以有一个或多个角色,并且一个角色可以属于一个或多个用户组
  • 角色可以有一个或多个角色,并且一个角色可以属于一个或多个角色
要在RDBMS中对上述内容进行建模,需要创建大量的交叉表。理想情况下,我只想在数据库中定义实体本身(用户、角色等)加上一些必需的属性。其他一切都将是动态的(即不需要DDL),例如,我可以创建一个具有未预定义的新属性的用户。我还可以在尚未预定义的实体之间创建关系,尽管数据库将像普通的RDBMS一样处理引用完整性


在RDBMS中,通过创建一个表来存储实体和另一个表来存储关系等,可以在一定程度上实现上述功能,但这会使执行简单查询所需的SQL变得过于复杂,并且可能会影响性能。

大多数NoSQL数据库都是按很好的规模构建的。这是以一致性为代价的,引用完整性是一致性的一部分。因此,大多数NoSQL不支持任何类型的关系约束

有一种类型的NoSQL数据库确实支持关系。事实上,它是专门为关系而设计的:关系。图形数据库存储节点和这些节点之间的显式关系(边)。节点和边都可以包含键/值对形式的数据,而不必绑定到预定义的模式

图形数据库针对关系查询和漂亮的图形操作进行了优化,例如查找两个节点之间的最短路径,或查找距离当前节点给定距离内的所有节点。在角色/权限场景中,您不需要这样做,但如果需要,使用RDBMS将很难实现


另一种选择是通过使用RDBMS存储关系和文档数据库存储实际数据,使整个数据层成为混合数据层。这会使您的应用程序稍微复杂一些,但我认为这不是一个很好的解决方案。您将使用两种不同的技术,都处理它们设计用来处理的问题。

有一种语言,由图形数据库支持。关于您的示例,请查看和。还有一个基于web的工具,包括Neo4j的REST API和Gremlin控制台,请参见。

鉴于您在问题中指定的要求,图形数据库可能是您正在寻找的类型,但还有其他选择。正如@Niels van der Rest所说,“无先验模式”和“参照完整性”这两个约束很难调和。您可能会找到一个基于主题图的数据库,可以这样做,但我不熟悉具体的实现,所以我不能确定

如果你决定你真的离不开引用完整性,我担心你可能会被RDBMS卡住。你可以使用一些技巧来避免你预期的一些问题,我将介绍一些技巧,这可能会给你一些想法。尽管如此,对于这种需要动态、后先验模式和元模式元素的数据模型,RDBMS总是很尴尬

如果你愿意放弃引用完整性,那么你仍然有三种方法要考虑。

  • Map/Reduce——有两种风格:面向分布式记录(think,MongoDB)和面向列(think,Cassandra)。可伸缩性非常好,但不会有类似SQL的语法;吸吮;将您的体系结构与特定的查询类型相匹配是至关重要的。在你的情况下,你关注的是实体和它们的属性,而不是实体本身之间的关系,所以我可能会考虑一个分布式的面向记录的存储;但只有当我预期需要扩展到单个节点之外时,它们的扩展才会非常好

  • 文档存储—技术上有两种风格,但其中一种是上面讨论的面向分布式记录的map/reduce数据存储。另一个是反向索引(想想,Lucene/Solr)。不要忽视倒排指数的威力;它们可以以惊人的速度解析极其复杂的记录谓词。他们不能很好地处理包含相关性或大型关系联接的查询。尽管如此,您还是会惊讶于记录谓词所提供的难以置信的灵活性和足够复杂的记录谓词

  • 图形存储-有几种风格:第一种是大规模的特殊键值存储(想想,DBM/Tokyotrant);第二个是元组空间(think,Neo4j);第三个是RDF数据库(想想,Sesame/Mulgara)。我很喜欢RDF,因为我帮助开发了mulgara,所以我不是最客观的评论者。尽管如此,如果您的可伸缩性约束允许您使用RDF存储,我发现RDF的指称语义(noSQL数据存储选项中很少有)所允许的推断是非常宝贵的


  • 您可能需要检查它是一个基于文档的数据库,因此具有灵活的模式。这非常棒,值得花时间看看它是否能满足您的需求。

    一些NoSQL解决方案支持