在我的项目中,它有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。
答案 0 :(得分:0)
从您描述项目的方式来看,似乎可能不需要嵌入式方法 - 如果您在城市和广场上使用索引,则可以非常快速地执行您提到的查询。嵌入往往对缓存更有帮助,或者当嵌入数据本身没有多大意义时,并且总是与父数据同时访问 - 在这里并不是这样,地址之类的东西就是一个很好的例子。
答案 1 :(得分:0)
我认为拥有一个商店集合是有意义的。
在每个商店文档中,您可以拥有一个名为city的属性,您也可以拥有属性广场。还有许多其他方法来构造其属性,包括更复杂的(子文档)值。
如果您的文件是:
{ storeName: "Books and Coffee",
location: "plaza 17",
city: "Anytown",
}
您可以使用
轻松查询Anytown中的所有商店db.stores.find({"city":"Anytown"})
将城市和广场存储在单独的集合中是没有意义的,因为每当您需要跨越多个集合的信息时,您将不得不进行多次查询,例如商店及其所在的城市,或者所有商店。城市“X”。