在我的Neo4j项目中,我有Role
和Permission
个实体,它们代表用户角色和权限。系统中的每个User
都与适当的角色和权限集相关。
我认为Role
和Permission
是某种超级节点,从未来的性能角度来看可能会成为一个主要问题。
此案例的最佳做法是什么?如何重新实现Role
和Permission
以避免超节点可能出现的问题?
答案 0 :(得分:3)
您是否打算根据角色进行一些聚合/质量查询(即计算某个角色的人数,列出它们)?
如果没有,而你只是想检查特定用户是否具有某种角色,而不是我认为它不应该导致难以维护,重要的性能问题(因为你将遍历图的某些关系,忽略绝大多数您的"超级节点")的多个关系。我会保持简单的设计("过早的优化是所有邪恶的根源&#34 ;;)),一旦注意到问题(内部,关系存储在类似链表的结构中,所以找到一个合适的可能花时间在超级节点上,即使你限制搜索某种关系类型),使用元节点方法拆分角色节点应该完成这项工作(它在Learning Neo4j中描述)
如果是,那你就有问题了。这可能是RDBMS更好的领域......使用元节点可能不会有帮助,因为您仍然需要处理所有这些以列出/统计所有用户......所以缓存该数据在一个单独的商店可能只是最好的主意...
答案 1 :(得分:2)
我将假设您只是将Neo4j用作权限查找数据源(如hasPermission(current_user, 'permission_string')
),而不是绑定到其他实体的任何查询。这可能没问题,特别是如果您有分层访问模式。如果那不是真的那么这可能不适用,并且更清楚地了解您的实体是什么样的。
由于您可能在整个应用程序中使用权限,因此可能会增加其大小和范围,因此使用某种形式的缓存(如内存存储或Redis)可以提高性能。示例
为每个用户生成每个权限状态的非规范化缓存甚至是有意义的。因此,您将评估可能基于分层角色/权限的规则,并提供“用户X具有权限Y”的列表。然后,无论何时更改用户或权限,都要为该实体重新生成缓存,如果更改了角色,则会为所有关联用户和权限重新生成缓存。
此外,我不知道是否会将此建议应用于Neo4j。如果您正在谈论一个简单的键/值查找,那么许多通用数据库在性能危急情况下就会过度。