【问题标题】:design mongodb schema for a specific project: embed documents or use foreign key为特定项目设计 mongodb 模式:嵌入文档或使用外键
【发布时间】:2012-06-14 03:23:01
【问题描述】:

在我的项目中,它有 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。

【问题讨论】:

  • 听起来倒退了——城市不是商店的属性吗?
  • 是的,城市是商店的属性

标签: mongodb schema-design


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    如果您的文档是:

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

    您可以轻松查询Anytown的所有商店

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多