0

在我的项目中,它有 3 个模型:

  1. 城市
  2. 广场
  3. 店铺

一个城市有广场和商店;一个广场有商店。

我最初的设计是为关系使用“外键”。(我是从mysql和jsut开始接mongodb的)

class City(Document):
     name = StringField()

class Plaza(Document):
     name = StringField()
     city = ObjectIdField()

class Store(Document):
     name = StringField()
     city = ObjectIDField()
     plaza = ObjectIdField()

我觉得这个设计很像sql的做法。

项目范围是这样的:5个城市;每个城市有5个广场;一个广场有200家商店。一家商店有许多产品(上面的代码中没有建模)

我将查询一个城市或一个广场的所有商店;一个城市的所有广场。

我应该在 City collection 中嵌入所有商店和广场吗?我听说不要在 mongodb 中使用引用,而是使用嵌入文档。在我的具体项目中,哪一个是更好的方法?对我来说,我对“外键”设计感到满意,但害怕不利用 mongodb。

4

2 回答 2

0

我认为拥有一个单一的商店集合是有意义的。

在每个商店文档中,您可以有一个名为 city 的属性,也可以有一个 plaza 属性。还有许多其他方式来构造其属性,包括更复杂的(子文档)值。

如果您的文件是:

{ storeName:  "Books and Coffee",
  location:   "plaza 17",
  city:       "Anytown",
}

您可以通过以下方式轻松查询 Anytown 中的所有商店

db.stores.find({"city":"Anytown"})

将 city 和 plaza 存储在单独的集合中是没有意义的,因为这样每次您需要跨越多个集合的信息时,您都必须进行多次查询,例如商店及其所在的城市,或 city “X”中的所有商店”。

于 2012-06-15T20:55:43.587 回答
0

从您描述项目的方式来看,似乎可能不需要嵌入式方法 - 如果您在城市和广场上使用索引,您可以非常快速地执行您提到的查询。嵌入往往对缓存更有帮助,或者当嵌入的数据本身没有多大意义时,并且总是与父数据同时访问 - 这里并非如此,像地址这样的东西就是一个很好的例子。

于 2012-06-14T15:33:48.990 回答