GraphDB帐户建模:用户访问关系属性还是关系?

GraphDB帐户建模:用户访问关系属性还是关系?,graph,neo4j,graph-databases,amazon-neptune,Graph,Neo4j,Graph Databases,Amazon Neptune,我试图在图形数据库中对帐户访问进行建模 该帐户可以有多个用户和多个功能。用户可以访问多个帐户。每个帐户只能为每个用户访问部分功能 我看到的一种方式是通过关系属性表示每个用户的访问权限,这允许拥有一个共享的功能节点 用户_1可以访问帐户_1-feature_1和帐户_2-feature-2。用户_1无权访问帐户_1-feature_2,即使该帐户已启用 另一种对相同访问进行建模的方法是创建特定于帐户的功能节点,但不使用关系属性 问题1:在graph DB世界中,这两种方法中哪一种更“合适”建模

我试图在图形数据库中对帐户访问进行建模

该帐户可以有多个用户和多个功能。用户可以访问多个帐户。每个帐户只能为每个用户访问部分功能

我看到的一种方式是通过关系属性表示每个用户的访问权限,这允许拥有一个共享的功能节点

用户_1可以访问帐户_1-feature_1和帐户_2-feature-2。用户_1无权访问帐户_1-feature_2,即使该帐户已启用

另一种对相同访问进行建模的方法是创建特定于帐户的功能节点,但不使用关系属性

问题1:在graph DB世界中,这两种方法中哪一种更“合适”建模

现在,为了让事情变得更有趣,帐户还可以有多个帐户可以访问的部件,并且某个功能的范围应该能够缩小到用户只能访问特定部件

在本例中,用户_1只能访问部分特征_1的帐户_1


在我看来,在关系上定义一个属性似乎是按功能和帐户的一部分缩小用户访问范围的方法。然而,阅读neo4j powerpoints时,这可能是关系的代码气味之一,关系具有“许多类似属性的属性”。有没有更好的方法用图表来处理这样的问题?

我可能错了,但这里是我的想法。从建模的角度来看,选项1听起来绝对是更好的方法,但是,我不知道如何在不建造重型机器的情况下保持数据的一致性。例如,如果有人删除了Account1.Feature1,并且没有从User1->Account1更新边缘,那么系统中的RBAC规则就会过时。你以为你能接触到一些东西,但事实上,“东西”已经不存在了。从数据模型的角度来看,选项2似乎不是很有吸引力,但它确实保持了数据的一致性。如果删除Account1.Feature1,则边缘将在同一事务中自动删除

唯一的缺点是,如果插入的节点比选项1多得多,则需要增加额外的插入成本。对于RBAC系统,我认为这是一个公平的折衷方案


同样的评论也适用于你问题的后半部分

我可能错了,但这是我的想法。从建模的角度来看,选项1听起来绝对是更好的方法,但是,我不知道如何在不建造重型机器的情况下保持数据的一致性。例如,如果有人删除了Account1.Feature1,并且没有从User1->Account1更新边缘,那么系统中的RBAC规则就会过时。你以为你能接触到一些东西,但事实上,“东西”已经不存在了。从数据模型的角度来看,选项2似乎不是很有吸引力,但它确实保持了数据的一致性。如果删除Account1.Feature1,则边缘将在同一事务中自动删除

唯一的缺点是,如果插入的节点比选项1多得多,则需要增加额外的插入成本。对于RBAC系统,我认为这是一个公平的折衷方案


同样的评论也适用于你问题的后半部分

根据数据库的规模,我更喜欢第一个。此外,维护第二种方法更难,因为每次对帐户或功能或两者进行更改时,都必须创建/修改节点featureX_accountY。就我的2美分。根据你数据库的规模,我更喜欢第一个。此外,维护第二种方法更难,因为每次对帐户或功能或两者进行更改时,都必须创建/修改节点featureX_accountY。只要我的2美分。