database - ArangoDB 中的一对一和一对多数据格式
问题描述
图形建模和 ArangoDB 的新手,我正在尝试替换关系数据库。对于一对一或一对多的关系,我正在努力寻找一种正确的方法来构建我的文档和边缘。
例如,要替换表auth_credentials
,auth_fb
其中auth_google
包含允许用户使用不同服务(用户名-密码、facebook、google)登录的信息。我可以想象 3 种结构化数据的方式:
- 使用身份验证信息创建集合
auth_*
,并使用 edgeCollectionsauths_users
将它们链接到用户。这很好地匹配了上面的模式,但我发现为每个身份验证对象创建 1 个文档和 1 个边缘很麻烦。 - 在我的
users
文档中,有一个auths
包含具有身份验证信息的对象数组的属性。我预计根据一些身份验证信息来查询用户会很困难,这可能缺少图表的意义。 - 创建 edgeCollections
auth_*
,_from
并_to
链接到拥有身份验证信息的用户的句柄。
我更喜欢最后一个选项,但我担心在我们一直拥有的地方拥有 edgeCollections 是一种反模式_from == _to
。同样,对于groups
,我会让它们成为管理员的边缘。
总结一下:为了表示属于数据 A 的数据 B,创建包含 B 的数据的边(从 A 到 A)是否是一种好方法?
解决方案
这听起来不像是图形用例。只有三种身份验证类型(凭据、facebook、google),并且身份验证信息不与多个用户共享。因此,我会将身份验证数据嵌入到用户文档中:
{
"_id": "user/1234",
"auth": {
"credentials": { ... },
"facebook": { ... },
"google": { ... }
}
}
嵌套属性是可选的,例如,如果没有 Google 身份验证的任何数据,只需将“google”属性留在一边。
属性路径非常容易访问,例如auth.credentials
. 如有必要,您还可以在子属性上创建索引。对于数组,在这方面存在一些限制,并且从数组中获取特定的身份验证信息会稍微复杂一些(除非您定义了固定顺序,即数组索引 0 处的凭据等,但您的数据结构不会不再是自我描述的)。
这也是最高效的解决方案,因为它是读取单个文档以检索用户 + 身份验证信息。
推荐阅读
- python - Python 中的 H2O GLM 在正则化中重复 Lambda 值
- html - 在反应中使用顺风 css 为范围滑块添加自定义工具提示
- methods - 我们如何通过方法合并处理 200 多个来源?
- r - 如何将具有数字和字符值的变量转换为 R 中的数字变量?
- ios - 如何在 xcode 中检查 SPM 回购链接?
- http-status-code-500 - 如何故意让所有 Mirage JS 请求返回 500?
- flutter - HMS Core Playstore 版本无法使用华为帐号登录
- r - 使用 R 中的 odbcConnect 从多个数据库中选择特定数据库
- python - 简单张量流模型中的输入维度问题
- c++ - 如何使用 c++ 全局运算符重载 luabridge 算术运算符?