为特定项目设计mongodb模式:嵌入文档或使用外键

时间:2012-06-14 03:23:02

标签: mongodb schema-design

在我的项目中,它有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系列中嵌入所有商店和广场吗?我听说不要在mongodb中使用引用,而是使用embeded文件。在我的具体项目中,哪一个是更好的方法?对我来说,我对“外键”设计很满意,但我害怕不利用mongodb。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

如果您的文件是:

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

您可以使用

轻松查询Anytown中的所有商店
db.stores.find({"city":"Anytown"})

将城市和广场存储在单独的集合中是没有意义的,因为每当您需要跨越多个集合的信息时,您将不得不进行多次查询,例如商店及其所在的城市,或者所有商店。城市“X”。