Database ArangoDB中的一对一和一对多数据格式
对于图形建模和ArangoDB来说,我是新手,我正在尝试替换关系数据库。对于一对一或一对多关系,我正在努力找到一种正确的方法来构造文档和边 例如,要替换表Database ArangoDB中的一对一和一对多数据格式,database,database-design,arangodb,Database,Database Design,Arangodb,对于图形建模和ArangoDB来说,我是新手,我正在尝试替换关系数据库。对于一对一或一对多关系,我正在努力找到一种正确的方法来构造文档和边 例如,要替换表auth_凭证,auth_fb,auth_谷歌,其中包含允许用户使用不同服务(用户名密码、facebook、谷歌)登录的信息。我可以想象3种数据结构化方式: 使用身份验证信息创建集合auth.*,并创建edgeCollectionsauth.\u用户以将其链接到用户。这与上面的模式非常匹配,但我发现为每个身份验证对象创建一个文档和一个边缘很
auth_凭证
,auth_fb
,auth_谷歌
,其中包含允许用户使用不同服务(用户名密码、facebook、谷歌)登录的信息。我可以想象3种数据结构化方式:
- 使用身份验证信息创建集合
,并创建edgeCollectionsauth.*
以将其链接到用户。这与上面的模式非常匹配,但我发现为每个身份验证对象创建一个文档和一个边缘很麻烦auth.\u用户
- 在my
文档中,有一个属性users
,其中包含具有身份验证信息的对象数组。我认为基于某些身份验证信息查询用户会很困难,这可能会忽略图形的意义auths
- 创建edgeCollections
,其中auth.*
和\u from
链接到拥有身份验证信息的用户的句柄\u to
\u from==\u to
的情况下使用edgeCollections是一种反模式。类似地,对于组
,我会让它们与管理员保持距离
总而言之:为了表示属于数据A的数据B,创建包含B数据的边(从A到A)是否是一种好方法?听起来不像是图形用例。只有三种身份验证类型(凭据、facebook、google),并且身份验证信息不会与多个用户共享。因此,我将在用户文档中嵌入auth数据:
{
"_id": "user/1234",
"auth": {
"credentials": { ... },
"facebook": { ... },
"google": { ... }
}
}
嵌套属性是可选的,例如,如果没有任何Google auth数据,只需将“Google”属性保留
属性路径非常容易访问,例如,auth.credentials
。如有必要,还可以在子属性上创建索引。对于数组,这方面存在一些限制,从数组中获取特定身份验证信息要复杂一些(除非定义固定顺序,即数组索引0处的凭据等,但数据结构将不再是自描述性的)
这也是性能最好的解决方案,因为它是一个单文档读取来检索用户+身份验证信息。听起来不像是一个图形用例。只有三种身份验证类型(凭据、facebook、google),并且身份验证信息不会与多个用户共享。因此,我将在用户文档中嵌入auth数据:
{
"_id": "user/1234",
"auth": {
"credentials": { ... },
"facebook": { ... },
"google": { ... }
}
}
嵌套属性是可选的,例如,如果没有任何Google auth数据,只需将“Google”属性保留
属性路径非常容易访问,例如,auth.credentials
。如有必要,还可以在子属性上创建索引。对于数组,这方面存在一些限制,从数组中获取特定身份验证信息要复杂一些(除非定义固定顺序,即数组索引0处的凭据等,但数据结构将不再是自描述性的)
这也是性能最好的解决方案,因为它是一个通过读取单个文档来检索用户+身份验证信息的解决方案