在我的Neo4j项目中,我有代表用户角色和权限的Role和Permission实体。系统中的每个User都与适当的角色和权限集有关系。
我认为Role和Permission是某种超级节点,从性能的角度来看,这可能成为未来的一个主要问题。
这个案子的最佳做法是什么?如何重新实现Role和Permission以避免超级节点可能出现的问题?
发布于 2015-08-06 06:54:34
您是否计划根据角色进行聚合/大量查询(即,计算特定角色的人数,列出它们)?
如果没有,您只想检查某个用户是否具有特定的角色,在我看来,这不应该导致维护困难、重要的性能问题(因为您将遍历图形中的某些关系,而忽略了绝大多数“超级节点”的多个关系)。我会坚持简单的设计(“过早优化是万恶之源”; ),一旦注意到问题(内部,关系存储在类似链接列表的结构中,因此在超级节点上找到合适的关系可能需要时间,即使您将搜索限制在某种关系类型上),使用元节点方法拆分角色节点应该可以完成这项工作(在学习Neo4j中已经描述过了)。
如果是的话你就有麻烦了。这可能是RDBMS更好的领域..。使用元节点可能不会有帮助,因为您仍然需要处理所有这些节点来列出/统计所有用户.所以在一个单独的存储中缓存数据可能是最好的主意.
发布于 2015-08-05 21:33:31
我将假设您只是使用Neo4j作为权限查找数据源(如hasPermission(current_user, 'permission_string')),而不是绑定到其他实体的任何查询中。这可能很好,特别是如果您有分层访问架构。如果这不是真的,那么这可能不适用,最好能更清楚地了解您的实体是什么样子。
由于您可能在整个应用程序中使用权限,而且如果它们的大小和范围要增加,那么使用某种形式的缓存(例如内存存储或Redis中的缓存)可能是有意义的。
为每个用户生成每个权限状态的非规范化缓存甚至可能是有意义的。因此,您将评估您的规则,这些规则可能基于分层角色/权限,并给出“用户X具有权限Y”的列表。然后,无论何时更改用户或权限,都会重新生成该实体的缓存,如果您更改了角色,则将重新生成所有相关用户和权限的缓存。
而且,我也不知道我是否会把这个建议应用于Neo4j。如果您说的是一个简单的键/值查找,那么在性能关键的情况下,许多通用数据库都会过度使用。
https://stackoverflow.com/questions/31833356
复制相似问题