【问题标题】:What is the best approach for storing two list of same type in mongoDB?在 mongoDB 中存储两个相同类型的列表的最佳方法是什么?
【发布时间】:2020-02-23 00:21:48
【问题描述】:

我想知道在数据库设计方面,存储参考 ID 或嵌入文档之间的最佳方法是什么,即使这意味着多个文档可以出现多次。

假设我目前有这种模型:

收藏用户:

{
    name: String,  
    types : List<Type> 
    sharedTypes: List<Type>
}

如果我使用嵌入式模型而不使用其他集合,则可能会导致重复的对象类型。例如,用户 A 创建类型 aa,用户 B 创建类型 bb。当他们相互分享时,他们键入会导致:

{
    name: UserA,  
    types : [{name: aa}]
    sharedTypes: [{name:bb}]
},
{
    name: UserB,  
    types : [{name: bb}] 
    sharedTypes: [{name:aa}]
}

这会导致重复,所以我猜这是非常糟糕的设计。我应该使用另一种方法,例如创建集合类型并存储 referenceId 吗?

收藏类型:

{
    id: String
    name: String
}

这仍然会导致重复,但不是一个完整的文档,我想这样会更好。

{
    name: UserA,  
    types : ["randomString1"]
    sharedTypes: ["randomString2"]
},
{
    name: UserA,  
    types : ["randomString2"] 
    sharedTypes: ["randomString1"]
}

最后一种方法,也许是最好的方法是从这样的集合类型中存储。

收藏用户:

{
   id: String
   name: String
}

收藏类型:

{
    id: String
    name: String,
    createdBy: String (id of user),
    sharedWith: List<String> (ids of user)
}

这 3 之间的最佳方法是什么? 我正在查询,我有一组用户,所以对于每个用户,我想要创建的类型和人们与我共享的类型。

【问题讨论】:

标签: database mongodb database-design


【解决方案1】:

总的来说,嵌入还是使用参考 ID 的决定归结为:

  1. 您是否需要轻松地保持连接数据在某个时间点的引用完整性,这意味着您要确保连接数据的状态与父数据“永久关联”?那么嵌入是一个好主意。这也是“仅插入”设计范例中的一个很好的做法。从长远来看,其他要求(例如不变性、哈希/校验和、安全性和存档)通常会使嵌入式方法更易于管理,因为版本/createDate 管理已大大简化。
  2. 您需要最快、最快速的可扩展性吗?然后嵌入并确保正确构建索引。索引查找,然后提取具有任意复杂嵌入数据的丰富形状是一项非常高性能的操作。
  3. (相反)您是否要确保对已连接数据的更新快速并立即反映在与父级的连接中?然后使用参考 ID 和 $lookup 函数将数据组合在一起。
  4. 连接的数据是否基本上不受限制地增长,例如针对帐户的交易?这可能通过引用 ID 到单独的事务集合并与 $lookup 结合来更好地处理。

【讨论】:

    猜你喜欢
    • 2022-09-27
    • 2013-02-15
    • 2017-09-18
    • 2021-10-22
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    相关资源
    最近更新 更多