如何在MongoDB中建模关系?

时间:2014-09-08 13:50:34

标签: sql mongodb data-modeling nosql

我最近在MongoDB开始学习,我对如何建立系统中实体之间的关系更加了解。

因此,当我习惯于以SQL方式建立这种关系时,当我改变逻辑以NoSQL方式思考时,我会感到困惑。

我看到MongoDB需要建模类型:嵌入式和引用式。

如果我理解正确,Referenced就像我们在SQL中所做的那样:

  • 示例:1对N

  • 创建两个表来表示实体,例如用户和地址。

  • 创建用户对象和地址对象

  • 将地址ID放入用户对象

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address_ids": [
      ObjectId("52ffc4a5d85242602e000000"),
      ObjectId("52ffc4a5d85242602e000001")
   ]
}

嵌入式:

  • 只创建一个表,在本例中为User。

  • 创建一个用户对象,并在其中放置地址对象:

{
   "_id":ObjectId("52ffc33cd85242f436000001"),
   "contact": "987654321",
   "dob": "01-01-1991",
   "name": "Tom Benzamin",
   "address": [
      {
         "building": "22 A, Indiana Apt",
         "pincode": 123456,
         "city": "Los Angeles",
         "state": "California"
      },
      {
         "building": "170 A, Acropolis Apt",
         "pincode": 456789,
         "city": "Chicago",
         "state": "Illinois"
      }]
}

所以,我的问题是:

要使用像MongoDB这样的NoSQL数据库的最佳功能,我必须使用嵌入式建模?

在嵌入式建模中我只创建一个实体,而内部的实体(本例中的地址对象)将没有ID,因为我没有创建表?

1 个答案:

答案 0 :(得分:1)

你对MongoDB说得对。正如您所说,您有两种方法来存储数据。 最好的方法取决于你需要什么。

如果您的地址对象将在其他地方使用,请将其放在另一个表中,否则,您可以将其直接放在对象中。

如果您将MongoDB与NodeJS配合使用,则可以使用MongooseJS。它是一种具有为mongodb对象定义模式的特殊性的框架。它特别适用于嵌入对象,因为它为您嵌入的每个对象添加了一个objectId。