首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >节点/边缘用户访问控制的图建模法

节点/边缘用户访问控制的图建模法
EN

Stack Overflow用户
提问于 2015-08-06 02:43:14
回答 1查看 319关注 0票数 3

有没有一组最佳实践来处理如何在图形数据库中建模数据(我现在正在考虑arangodb,但这个问题将适用于其他平台)?

每个用户都有联系人,但有些联系人可能是用户共有的,例如John认识Mary,Marc认识Mary。因此,我将有3个节点(John、Mary和Marc),但John应该只看到他与Mary的关系,而不是Marc与Mary的关系

那么,为了支持用户访问他们的信息,应该如何设计一个完整的图呢?

选项1:为每个用户创建1个图。这样,我就可以确切地知道谁可以看到什么(例如,我可以用用户id作为我所有集合的前缀)。这很简单,但会复制很多数据(例如,如果我把我所有的家人都放在数据库中,我的兄弟也会这样做,在不同的图表中创建两次相同的数据)

我将连接联系人John、Mary和Marc,但表示John的用户节点将仅链接到联系人节点John和Mary。这样,我就知道只获取连接到我关注的用户节点的联系人节点。问题是边不能链接到用户节点(我不能让边从节点到edge...can I?)。因此,我必须将user_id属性添加到所有边,以便只获取与当前用户相关的边。这稍微好一点,因为我不需要复制节点,但我仍然需要复制边,因为它们是特定于用户的

选项3:像使用权限表一样使用SQL,维护联系人it列表,以及哪些用户可以看到哪些节点和哪些边缘(重在连接上)

选项4:??

就像在任何事情中一样,有许多方法可以达到解决方案,但我想知道什么是平衡方法的整洁性和插入/删除的性能的最佳实践……知道性能可能取决于平台

EN

回答 1

Stack Overflow用户

发布于 2015-08-06 23:16:32

我会建议一个选项4:

首先,我不会区分User和Contact节点,但它们都应该是Contact节点。如果您创建了一个新用户,那么基本上就是为他创建了一个新联系人(或使用现有联系人),并将您的应用程序身份验证连接到此特定联系人。

然后,您可以使用有向边为用户创建联系人列表。假设您有两个用户John和Mary,那么John可以将Mary添加到他的联系人列表中,但是Mary将无法识别。如果她想添加John,这意味着您将添加第二条边。如果您只想拥有对称联系人(如果John将Mary添加到他的列表中,他应该自动出现在她的列表中),您只需在查询中忽略此方向即可。

如果您现在想要获取John的联系人,可以通过选择John的邻居来完成。

在ArangoDB中,这可以通过两个集合来实现,比如ContactKnows,其中Knows保存边缘。

粘贴到arangosh中的以下代码创建了上述情况:

代码语言:javascript
复制
db._create("Contact");
db._createEdgeCollection("Knows");
db.Contact.save({_key: "John", mail: "john@example.com"});
db.Contact.save({_key: "Mary", mail: "mary@somewhere.com"});
db.Contact.save({_key: "Marc", mail: "marc@somewhereelse.com"});

db.Knows.save("Contact/John", "Contact/Mary", {});
db.Knows.save("Contact/Marc", "Contact/Mary", {});

要查询用户John的联系人列表:

db._query('RETURN NEIGHBORS(Contact, Knows, "John", "outbound")').toArray()

应该会给出Mary的结果,没有Marc的信息。

如果您不想像我建议的那样连接联系人和用户帐户,您也可以将它们分离到不同的集合中,在这种情况下,您必须稍微修改边缘和查询:

代码语言:javascript
复制
db.Knows.save("User/John", "Contact/Mary", {});
db.Knows.save("User/Marc", "Contact/Mary", {});

db._query('RETURN NEIGHBORS(Users, Knows, "John", "outbound")').toArray()

应该会得到同样的结果。

编辑:关于选项2中的问题:在ArangoDB中,实际上可以将边指向其他边,但是内置图形功能现在会将指向的边视为节点。这意味着它们不会自动跟随它们的方向。但是您可以在后续的AQL语句中使用这些结果边,并使用AQL功能继续搜索。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31840405

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档