【问题标题】:what is the best structure of a shop & product like database in mongodb? [closed]mongodb中商店和产品之类的数据库的最佳结构是什么? [关闭]
【发布时间】:2012-10-07 11:48:39
【问题描述】:

我认为像数据库这样的商店和产品有两种结构

第一

  ShopSchema = new Schema({
     product_ids:[Schema.Types.ObjectId],
  })

   ProductSchema = new Schema({
     product_name:String,
  })

  ShopSchema = new Schema({

  })

   ProductSchema = new Schema({
     shop_id:Schema.Types.ObjectId,
     product_name:String,
  })

与第二个解决方案相比,第一个解决方案有一个干净的产品集合,产品集合中的每个文档都有一个 shop_id 字段(我认为有点浪费空间),但是通过第一个结构获取所有产品可能会很痛苦,而第二个是很简单。

所以我想知道哪个是最好的。还是有更好的解决方案?

【问题讨论】:

    标签: mongodb schema database


    【解决方案1】:

    问自己以下问题:您是否可以在多家商店销售相同的产品?

    如果答案是否定的,那么您可以认为 shop_id 是 Shop 的属性,您提供的第二个选项应该是有效的解决方案。

    如果答案是肯定的,那么您需要能够将一个产品映射到多个商店。如果您要使用第二种设计,您将需要多次复制产品对象,每个商店出售一次,这相当于您可以调用的新模式,例如 ProductInShop

    请注意,您仍然有两个非常有效的选项来对此进行建模。您可以 1) 将 product_ids 属性添加到 ShopSchema 或 2) 将 shop_ids 属性添加到 ProductSchema

    我猜想节省空间也意味着规范化数据。与关系数据库不同,在文档数据库中,您通常倾向于避免规范化,而是尽可能地去规范化。例如:在关系数据库中,您通常会将其添加为包含shop_idproduct_id 列的新表。在像 MongoDB 这样的文档数据库中,您通常应该更喜欢将尽可能多的嵌入到单个文档中以避免“文档连接”。

    也只是关于 Mongoose 的说明。如果您想利用 Mongoose 的 populate,请另外提供对集合名称的明确引用。例如:

    var ShopSchema = new Schema({
       product_ids: [{ type: Schema.Types.ObjectId, ref: 'Product' }]
    });
    

    通过这种方式,您可以使用 Mongoose,例如“查找所有商店和每个商店出售的所有产品”:

    Shop.find().populate('product_ids').exec(function (err, shops) {
        // ...
    });
    

    【讨论】:

    • thanx man 这真的很有帮助。我想我应该记住这一点“在像 MongoDB 这样的文档数据库中,您通常应该更喜欢将尽可能多的嵌入到单个文档中以避免“文档连接”。”
    【解决方案2】:

    第二个版本对于大多数用例来说效率更高。非规范化是 NoSQL 持久性解决方案的游戏名称。目标是在尽可能少的查询中获得尽可能多的数据。这通常需要复制数据并处理在重复数据更改时必须更新大量文档的潜在麻烦。

    例如,如果您希望在网页上显示该信息,您甚至可能必须将商店名称添加到产品文档中,因为如果您不这样做,您最终仍将不得不查询商店系列。考虑到商店名称不会改变这一事实,这应该相对来说不会让人头疼,但在设计架构时,您必须考虑这些事情。从您的用例开始,然后在设计一个时逐步进行。

    【讨论】:

      猜你喜欢
      • 2012-03-10
      • 1970-01-01
      • 2021-08-17
      • 2022-01-12
      • 2021-11-03
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 2023-03-25
      相关资源
      最近更新 更多