2017-08-02 96 views
0

我想设计产品之间的模式关系有多个类别什么是你选择的性能(读,写)更好。如何设计架构更好,产品与类别的关系

模式1 :: 2收集,用CATEGORY_ID阵列

 

    Collection Category { id , name } 
    Collection Product { id , name , category_ids: [category_id_1,category_id_2] } 

模式2 :: 3收集,参考与新采集的参考

 

    Collection Category { id , name } 
    Collection Product { id , name } 
    Collection product_category { id , product_id, category_id } 

模式3:2收藏,镶嵌收藏参考

 

    Collection Category { id , name } 
    Collection Product { id , name , 
     category_ids: { 
      {id, category_id_1} 
      {id, category_id_2} 
      {id, category_id_3} 
     } 
    } 

非常感谢。

回答

1

拇指规则是在使用MongoDB和一般使用NoSQL时使规范化(?)。因此,如果您不能(或不能)使用单个集合,则最好使用两个集合。

背后的原因是,MongoDB不提供事务(但)由于看起来较少缩放的好理由。但它确实提供了原子更新,因此单个集合对于操作是安全的。

出于这个原因,3集合中的选项2不是一个好主意(看起来很糟糕)。

看起来像类别数据并不会像产品数据那样经常变化,所以我认为第一个选项比第三个选项更有意义。

如果您在category_ids字段上使用多键索引,还有一件事情是在第一个选项,这对更快的访问会有好处。如果您在第三个选项上的category_ids上使用索引,这不会有帮助,因为对象上的索引与数组上的效率不同。

您在第三个选项中的一个好处是您可以为每个category_id保存产品的一些关联数据。

如果这是一件不想丢失的东西,那么你可以使用一个对象数组。

方案4:

Collection Category { id , name } 
Collection Product { id , name , 
    category_ids: [ 
     {id : category_id_1, limit : 10} 
     {id : category_id_2, limit : 20 } 
     {id :category_id_3, limit : 15 } 
    ] 
} 

在这种情况下,我们可以与每个类别中的每个产品的关联限制因素相关联。

但通过避免RDBMS到NoSql的最佳实践来帮助自己。

0

,如果我有一个10,000,000产品记录

如果我选择你的选择4:

 

    Collection Category { id , name } 
    Collection Product { id , name , 
     category_ids: [ 
      {id : category_id_1, limit : 10} 
      {id : category_id_2, limit : 20 } 
      {id :category_id_3, limit : 15 } 
     ] 
    } 

通过CATEGORY_ID搜索产品

  • 我觉得这个选择是读取性能bad
  • 因为mongodb通过c查找“Collection Product”上的所有文档ategory_id。

如果我选择选项2,我想通过CATEGORY_ID

 

    Collection Category { id , name } 
    Collection Product { id , name } 
    Collection product_category { id , product_id, category_id } 

  • 我从 “收集PRODUCT_CATEGORY” 由CATEGORY_ID搜索产品搜索PRODUCT_ID。
  • 我的产品ID列表
  • 我得到product_ids

的“收藏品”产品文档或这种选择是好。

谢谢。

+1

我不同意读取性能不好的假设。你可以像db.Product.find一样查询({'category_id.id':category_id_2})。如果你有适当的索引,它会很快,并在一个查询中执行任务, 为什么我会避免选项2是因为简单的原因是从product_category你既不能获得产品也不能获得类别数据,所以你将不得不做多个在没有交易的情况下,一旦应用程序业务成熟,这可能会成为一个痛点。 –

相关问题