MongoDB数据关系建模

MongoDB中的数据是非常灵活的,集合中也不强制文档要采用统一的结构。但是认真考虑数据模型依然是非常重要的,因为这会影响到应用程序性能和数据库的能力。本文讲述了MongoDB中常见的一对一、一对多关系模型如如何建模。

(1)一对一嵌入式文档模型(Embedded Document Model)

假设赞助商和住址是一种一对一关系,赞助商只有一处住址。赞助商可以看成是住址的属性或字段,住址也可以看成是赞助商的一个属性或字段。在类似于这种关系中,使用嵌入式数据模型(Embedded)的好处就是在一次查询中就能得到想要的全部数据,而引用性模型(References)则需要多次查询才能得到想要的数据(姓名和住址)。

赞助商和住址之间的关系(References)



{

_id: "joe",

name: "Joe Bookreader"

}

{

patron_id: "joe",

street: "123 Fake Street",

city: "Faketon",

state: "MA",

zip: "12345"

}

赞助商和住址之间的关系(Embeded)



{

_id: "joe",

name: "Joe Bookreader",

address: {

street: "123 Fake Street",

city: "Faketon",

state: "MA",

zip: "12345"

}

}

(2)一对多嵌入式文档模型(Embedded Document Model)


     假设赞助商和住址是一种一对多关系,赞助商有多处住址,可以使用引用模型将赞助商当做住址的属性,可以使用嵌入模型将住址当成赞助商的属性。这样的场景适合使用嵌入式模型,一来只有一次查询就能得到想要的所有数据。二来,在一个上下文中就能看到数据数据,结构比较简单。

赞助商和住址之间的关系(References)



{

_id: "joe",

name: "Joe Bookreader"

}

{

patron_id: "joe",

street: "123 Fake Street",

city: "Faketon",

state: "MA",

zip: "12345"

}

{

patron_id: "joe",

street: "1 Some Other Street",

city: "Boston",

state: "MA",

zip: "12345"

}

赞助商和住址之间的关系(Embeded)



{

_id: "joe",

name: "Joe Bookreader",

addresses: [

{

street: "123 Fake Street",

city: "Faketon",

state: "MA",

zip: "12345"

},

{

street: "1 Some Other Street",

city: "Boston",

state: "MA",

zip: "12345"

}

]

}


    (三)一对多引用型文档模型(References Document Model)


    图书出版商和图书之间是一种一对多关系,一个出版本可以初版多本图书,可以一本图书只能由一个出版商发行。在这种情形下,如果我们仍使用嵌入式数据模型,可能会导致数据重复,见下图:


{

title: "MongoDB: The Definitive Guide",

author: [ "Kristina Chodorow", "Mike Dirolf" ],

published_date: ISODate("2010-09-24"),

pages: 216,

language: "English",

publisher: {

name: "O‘Reilly Media",

founded: 1980,

location: "CA"

}

}

{

title: "50 Tips and Tricks for MongoDB Developer",

author: "Kristina Chodorow",

published_date: ISODate("2011-05-06"),

pages: 68,

language: "English",

publisher: {

name: "O‘Reilly Media",

founded: 1980,

location: "CA"

}

}


    为了避免出现数据重复,最好的方法是使用引用型数据模型,将图书出版商和初版图书分别保存在不同的集合中。

使用引用模型时,引用关系存储在哪一方是由关系之间的数据量决定的。如果出版商的图书增长的非常缓慢,也可以说是每个出版商出版的图书数量有限,可以将关系存储在出版商这边。如下所示:


{

name: "O‘Reilly Media",

founded: 1980,

location: "CA",

books: [12346789, 234567890, ...]

}

{

_id: 123456789,

title: "MongoDB: The Definitive Guide",

author: [ "Kristina Chodorow", "Mike Dirolf" ],

published_date: ISODate("2010-09-24"),

pages: 216,

language: "English"

}

{

_id: 234567890,

title: "50 Tips and Tricks for MongoDB Developer",

author: "Kristina Chodorow",

published_date: ISODate("2011-05-06"),

pages: 68,

language: "English"

}


    但如果出版商出版的图书数量非常多,这种模型会导致数据模型发生变化,尤其是增长的数组。这时,最好将引用关系存储在图书一方,如下图:


{

_id: "oreilly",

name: "O‘Reilly Media",

founded: 1980,

location: "CA"

}

{

_id: 123456789,

title: "MongoDB: The Definitive Guide",

author: [ "Kristina Chodorow", "Mike Dirolf" ],

published_date: ISODate("2010-09-24"),

pages: 216,

language: "English",

publisher_id: "oreilly"

}

{

_id: 234567890,

title: "50 Tips and Tricks for MongoDB Developer",

author: "Kristina Chodorow",

published_date: ISODate("2011-05-06"),

pages: 68,

language: "English",

publisher_id: "oreilly"

}



时间: 2024-10-10 05:55:55

MongoDB数据关系建模的相关文章

《Entity Framework 6 Recipes》翻译系列 (5) -----第二章 实体数据建模基础之有载荷和无载荷的多对多关系建模 (转)

2-3 无载荷(with NO Payload)的多对多关系建模 问题 在数据库中,存在通过一张链接表来关联两张表的情况.链接表仅包含连接两张表形成多对多关系的外键,你需要把这两张多对多关系的表导入到实体框架模型中. 解决方案 我们设想,你数据库中的表与图2-10一样. 图2-10 艺术家和专辑多对多关系 按下面的步骤将这些表和关系导入到模型中: 1.右键你的项目,选择Add(增加) ?New Item(新建项),然后选择Visual C#条目下的Data模板下的ADO.NET Entity D

MongoDB 一对多关系建模

本篇博客翻译自: http://blog.mongodb.org/post/87200945828/6-rules-of-thumb-for-mongodb-schema-design-part-1?mkt_tok=3RkMMJWWfF9wsRonsq7Ldu%2FhmjTEU5z14uUsUKGxhokz2EFye%2BLIHETpodcMTcVnM7zYDBceEJhqyQJxPr3FLdcN0tJuRhTrCw%3D%3D 备注:本译文不是严格意义上的翻译,仅仅是在基于对该原文的理解之上,

mongoose - 数据关系模型

********************** 作者:  张启卫 时间: 2017年5月23号 功能: mongoDB 与 mongoose 数据关系模型 * 一对一 * 一对多 * 多对多 ********************** 一.嵌入式的(Embed) 1. 添加mongoose模块, 连接数据库 var mongoose = require('mongoose'); mongoose.connect("mongodb://localhost/data_test"); 2.

MongoDB 8关系

p.p1 { margin: 0.0px 0.0px 2.0px 0.0px; font: 14.0px "Helvetica Neue"; color: #454545 } p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px ".PingFang SC"; color: #454545 } p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "He

MongoDB数据文件内部结构

有人在Quora上提问:MongoDB数据文件内部的组织结构是什么样的.随后10gen的工程师Jared Rosoff出来做了简短的回答. 每一个数据库都有自己独立的文件.如果你开启了directoryperdb选项,那你每个库的文件会单独放在一个文件夹里. 数据库文件在内部会被切分成单个的块,每个块只保存一个名字空间的数据.在MongoDB中,名字空间用于区分不同的存储类别.比如每个collection有一个独立的名字空间,每个索引也有自己的名字空间. 在一个块中,会保存多条记录,每条记录是B

MongoDB 数据迁移和同步

MongoDB 数据迁移和同步 MongoDB的数据同步 复制 mongodb的复制至少需要两个实例.其中一个是主节点master,负责处理客户端请求,其余的都是slave,负责从master上复制数据. master写处理:master负责接收写请求,具体的流程为: 如果开启journal功能,则先将写请求记录到journal中,然后批量执行,同时将操作记录到oplog中: 如果未开启journal功能,则对每个写请求进行单独操作,然后写入oplog. 注:oplog是幂等的,当有累加操作in

Mongodb数据库命令端常用操作

查询操作 Mongodb-SpringMvc下Query数据库操作SQL http://blog.csdn.net/xiaohulunb/article/details/27828381 1.查询所有 > db.foo.find() { "_id" : ObjectId("5389aa1df06b88aaa313746a"), "name" : "yiwa", "age" : 25, "us

使用Kettle增量抽取MongoDB数据实践

需求: 增量抽取MongoDB数据并加载到MSSQL 由于不能使用关系型数据库的自定义SQL, 所以主要遇到的问题有: 增量时间的查询和参数控制 ETL的批次信息和调用参数的写入 第一个问题的解决如下: 使用命名参数在Query页中进行过滤, 一开始会担心${}的引用方式会用Mongo的语法冲突, 测试后发现运行正常 第二个问题: 先为结果增加常量值, 如常量值固定则直接写死, 不固定的常量值先设置为空串, 在后面使用字符串替换组件传入命名参数, 最后用字段选择把空串的常量值移除

MongoDB数据表基本操作

MongoDB数据表基本操作 查看全部数据表 > use ChatRoom switched to db ChatRoom > show collections Account Chat system.indexes system.users 创建数据表 > db.createCollection("Account") {"ok":1} > db.createCollection("Test",{capped:true,