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

Database ArangoDB中的一对一和一对多数据格式,database,database-design,arangodb,Database,Database Design,Arangodb,对于图形建模和ArangoDB来说,我是新手,我正在尝试替换关系数据库。对于一对一或一对多关系,我正在努力找到一种正确的方法来构造文档和边 例如,要替换表auth_凭证,auth_fb,auth_谷歌,其中包含允许用户使用不同服务(用户名密码、facebook、谷歌)登录的信息。我可以想象3种数据结构化方式: 使用身份验证信息创建集合auth.*,并创建edgeCollectionsauth.\u用户以将其链接到用户。这与上面的模式非常匹配,但我发现为每个身份验证对象创建一个文档和一个边缘很

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

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

  • 使用身份验证信息创建集合
    auth.*
    ,并创建edgeCollections
    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处的凭据等,但数据结构将不再是自描述性的)

这也是性能最好的解决方案,因为它是一个通过读取单个文档来检索用户+身份验证信息的解决方案