ArangoDB中的一对一和一对多数据格式

时间:2018-05-14 22:09:30

标签: database database-design arangodb

图形建模和ArangoDB的新手,我正在尝试替换关系数据库。对于一对一或一对多的关系,我很难找到一种正确的方法来构建我的文档和边缘。

UML representation of database

例如,要替换包含允许用户使用不同服务登录的信息的表auth_credentialsauth_fbauth_google(用户名 - 密码,脸书,谷歌)。我可以想象3种结构化数据的方法:

  • 使用身份验证信息创建集合auth_*,并使用edgeCollections auths_users将其链接到用户。这与上面的模式很匹配,但我觉得为每个身份验证对象创建1个文档和1个边缘很麻烦。
  • 在我的users文档中,有一个属性auths,其中包含带有身份验证信息的对象数组。我希望根据一些身份验证信息来查询用户很困难,这可能会忽略图表的重点。
  • 创建edgeCollections auth_*,其中_from_to链接到拥有身份验证信息的用户的句柄。

我更喜欢最后一个选项,但是我担心有一个反模式有一个edgeCollections我们总是有_from == _to。同样地,对于groups,我会将它们与管理员进行边缘处理。

总结:要表示属于数据A的数据B,创建包含B数据的边(从A到A)是一种好方法吗?

1 个答案:

答案 0 :(得分:2)

听起来不像图形用例。只有三种身份验证类型(凭据,Facebook,谷歌),并且不会与多个用户共享身份验证信息。因此,我会将auth数据嵌入用户文档中:

{
    "_id": "user/1234",
    "auth": {
        "credentials": { ... },
        "facebook": { ... },
        "google": { ... }
    }
}

嵌套属性是可选的,例如如果没有Google身份验证的任何数据,只需将“google”属性保留下来。

属性路径非常容易访问,例如auth.credentials。如有必要,您还可以在子属性上创建索引。对于数组,在这方面存在一些限制,从数组中获取某个auth信息会有点复杂(除非你定义一个固定的顺序,即数组索引0等的凭证,但你的数据结构不会'不再是自我描述了。)

这也是性能最高的解决方案,因为它是一个用于检索用户+身份验证信息的单个文档。