首页 > 解决方案 > ArangoDB 中的一对一和一对多数据格式

问题描述

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

数据库的UML表示

例如,要替换表auth_credentialsauth_fb其中auth_google包含允许用户使用不同服务(用户名-密码、facebook、google)登录的信息。我可以想象 3 种结构化数据的方式:

我更喜欢最后一个选项,但我担心在我们一直拥有的地方拥有 edgeCollections 是一种反模式_from == _to。同样,对于groups,我会让它们成为管理员的边缘。

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

标签: databasedatabase-designarangodb

解决方案


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

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

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

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

这也是最高效的解决方案,因为它是读取单个文档以检索用户 + 身份验证信息。


推荐阅读