neo4j - 密码多关系或两个节点之间关系的属性
问题描述
我设计了一个 neo4j 数据库,这个数据库有两个标签用户和组。每个用户都可以是组中的成员或管理员。我也需要保存组的创建者。因此,我为组中的用户有 3 个可能的角色。
现在,我将用户角色保存在名为 MEMBER_OF_GROUP 关系的类型上的列表属性中。成员MEMBER
在此列表中,这也适用于创建者和管理员,因此作为组的创建者、管理员和组成员的用户在与组的关系的类型列表中具有MEMBER
, ADMIN
,CREATOR
如下图示例。
在这种设计中,很难在组中找到用户的角色,因为我首先需要检查关系是否存在,然后检查该角色是否在类型属性中。
我可以重新设计 db 并为每个角色添加 3 个关系关系MEMBER_IN_GROUP
, CREATOR_OF_GROUP
, ADMIN_OF_GROUP
. 哪个设计更好?两个节点之间有多重关系或添加一个节点和一个属性来保存角色?多重关系可能会导致任何问题吗?这个问题有更好的设计吗?
解决方案
如果您要不断寻找特定角色,我会看到拥有多种关系的更多好处。遵循 rel 比遍历数组属性要快得多,属性物理存储在与关系和节点不同的位置,因此 Neo4j 需要做一些额外的工作才能访问它。
作为一般建议,在进行建模时,最好看看您将如何查询数据库以及对如何编写它们的性能影响。如果您想了解有关 Neo4j 如何存储数据的详细信息,请搜索其“原生图”技术概念。https://neo4j.com/blog/native-vs-non-native-graph-technology/
您可以在本书的第 3 章找到更多关于使用 Neo4j 建模图形数据库的技巧:https ://neo4j.com/graph-databases-book/
推荐阅读
- arrays - 在 Excel 中显示 VBA 返回的数组(不确定长度)
- excel - 启用和禁用 com 加载项
- c# - 与 Access 数据库的 C# 连接失败。研究指出 32 位访问与 64 位项目,但解决方案不起作用
- flutter - 子widget的build方法后触发的设置父widget状态的回调不会触发其父widget的build方法
- linux - 保持活动流式ffmpeg rtmp
- r - 如何将 glm() 整洁地放入类似 lmList 的结构中?
- visual-studio - 需要使用 Azure Devops 中的存储库自动每晚同步服务器硬盘驱动器上的文件
- javascript - 为什么我无法使用 Knex 将 false (0) 设置为我的表格的默认值?
- flutter - 如何使用 Google Maps Plugin Flutter 为另一个类的相机设置动画
- python - 无法加载 TensorFlow