图形建模和ArangoDB的新手,我正在尝试替换关系数据库。对于一对一或一对多的关系,我很难找到一种正确的方法来构建我的文档和边缘。
例如,要替换包含允许用户使用不同服务登录的信息的表auth_credentials
,auth_fb
,auth_google
(用户名 - 密码,脸书,谷歌)。我可以想象3种结构化数据的方法:
auth_*
,并使用edgeCollections auths_users
将其链接到用户。这与上面的模式很匹配,但我觉得为每个身份验证对象创建1个文档和1个边缘很麻烦。users
文档中,有一个属性auths
,其中包含带有身份验证信息的对象数组。我希望根据一些身份验证信息来查询用户很困难,这可能会忽略图表的重点。auth_*
,其中_from
和_to
链接到拥有身份验证信息的用户的句柄。我更喜欢最后一个选项,但是我担心有一个反模式有一个edgeCollections我们总是有_from == _to
。同样地,对于groups
,我会将它们与管理员进行边缘处理。
总结:要表示属于数据A的数据B,创建包含B数据的边(从A到A)是一种好方法吗?
答案 0 :(得分:2)
听起来不像图形用例。只有三种身份验证类型(凭据,Facebook,谷歌),并且不会与多个用户共享身份验证信息。因此,我会将auth数据嵌入用户文档中:
{
"_id": "user/1234",
"auth": {
"credentials": { ... },
"facebook": { ... },
"google": { ... }
}
}
嵌套属性是可选的,例如如果没有Google身份验证的任何数据,只需将“google”属性保留下来。
属性路径非常容易访问,例如auth.credentials
。如有必要,您还可以在子属性上创建索引。对于数组,在这方面存在一些限制,从数组中获取某个auth信息会有点复杂(除非你定义一个固定的顺序,即数组索引0等的凭证,但你的数据结构不会'不再是自我描述了。)
这也是性能最高的解决方案,因为它是一个用于检索用户+身份验证信息的单个文档。