1

我认为有两种类型的商店和产品结构,如数据库

第一的

  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 字段(我认为有点浪费空间),但是通过第一个结构获取所有产品可能会很痛苦,而第二个很容易。

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

4

2 回答 2

1

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

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

于 2012-10-17T09:08:11.530 回答
1

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

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

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

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

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

也只是关于猫鼬的注释。如果您想利用 Mongoose 的populate,请另外提供对集合名称的显​​式引用。例如:

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

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

Shop.find().populate('product_ids').exec(function (err, shops) {
    // ...
});
于 2012-10-17T09:08:27.463 回答