是否有一种数据库可以为您带来引用完整性的优势并能够使用 SQL 类型语言进行查询,同时还可以松散地定义实体的数据属性以及它们之间的关系?
例如。采用 RBAC 类型模型,其中有权限、用户、用户组和角色。复杂/灵活的模型可能具有以下规则:
- 角色可以拥有一个或多个权限,一个权限可以属于一个或多个角色
- 用户可以拥有一个或多个权限,一个权限可以属于一个或多个用户
- 用户组可以拥有一个或多个权限,并且一个权限可以属于一个或多个用户组
- 用户可以拥有一个或多个角色,一个角色可以属于一个或多个用户
- 用户组可以有一个或多个角色,一个角色可以属于一个或多个用户组
- 角色可以拥有一个或多个角色,一个角色可以属于一个或多个角色
要在 RDBMS 中对上述内容进行建模将涉及创建大量交集表。理想情况下,我想在数据库中定义的只是实体本身(用户、角色等)加上一些强制属性。其他一切都将是动态的(即不需要 DDL),例如我可以创建一个具有未预定义的新属性的用户。我还可以在尚未预定义的实体之间创建关系,尽管数据库会像普通 RDBMS 一样处理引用完整性。
在 RDBMS 中,可以通过创建一个表来存储实体和另一个表来存储关系等来在某种程度上实现上述目标,但这会使执行简单查询所需的 SQL 过于复杂,并且还可能会影响性能。
大多数 NoSQL 数据库都是为了很好地扩展而构建的。这是以一致性为代价的,而引用完整性是一致性的一部分。因此大多数 NoSQL 不支持任何类型的关系约束。
有一种类型的 NoSQL 数据库确实支持关系。事实上,它是专门为关系而设计的:图数据库 http://en.wikipedia.org/wiki/Graph_database。图数据库存储节点以及这些节点之间的显式关系(边)。节点和边都可以包含键/值对形式的数据,而无需绑定到预定义的模式。
图形数据库针对关系查询和漂亮的图形操作进行了优化,例如查找两个节点之间的最短路径,或查找距当前节点给定距离内的所有节点。在角色/权限场景中您不需要这样做,但如果需要,使用 RDBMS 来实现会困难得多。
另一种选择是使整个数据层成为混合层,使用 RDBMS 来存储关系,并使用文档数据库来存储实际数据。这会使您的应用程序稍微复杂化,但我不认为这是一个糟糕的解决方案。您将使用两种不同的技术,两者都可以处理它们旨在处理的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)