当前位置:网站首页 / 数据库 / 正文

【转载】MongoDB 一对多关系建模

时间:2015年11月09日 | 作者 : aaronyang | 分类 : 数据库 | 浏览: 1363次 | 评论 0

很多刚从传统SQL开发转向MongoDB开发的朋友都会问到一个问题:如何用MongoDB表达传统关系数据库中的一对多(1 to n)关系?

基于MongoDB丰富的表达力,我们不能说我们必须采用一个标准的方法来进行1 to n的建模。稍后我们从3个具体场景来展开讲解。


首先,我们将1 to n中的n进行场景细化。这个n究竟代表多大的量级呢?是几个到几十个?还是几个到几千个?还是成千上万个?

1) 1 to n(n代表好几个,或几十个,反正不太多)

比如每个Person会有多个Address。此种情况下,我们采用最简单的嵌入式文档来建模。


{name: 'Kate Monster',id: '123-456-7890',addresses : [{ street: '123 Sesame St', city: 'Anytown', cc: 'USA' },{ street: '123 Avenue Q', city: 'New York', cc: 'USA' }]}

这种建模方式的优缺点也非常明显:


优点:部件是作为独立文档(document)存在的,你可以对某一部件进行独立的操作,比如查询或更新。

缺点:如上,你必须通过两次查询才能找到某一个产品所属的所有部件信息。

在本例中,这个缺点是可以接受的,本身实现起来也不难。而且,通过这种建模,你可以轻易的将1 to n扩展到n to n,即一个产品可以包含多个部件,同时一个部件也可以被多个产品所引用(即同一部件可以被多个产品使用)。


3)1 to n(这个n代表很大的数值,比如成千上万,甚至更大)

比如,每一个主机(host)会产生很大数量的日志信息(logmsg)。在这种情况下,如果你采用嵌入式建模,则一个host文档会非常庞大,从而轻易超过MongoDB的文档大小限制,所以不可行。如果你采用第二中方式建模,用数组来存放所有logmsg的_id值,这种方式同样不可行,因为当日志很多时,即使单单引用objectId也会轻易超过文档大小限制。所以此时,我们采用以下方式:


主机(hosts):{_id : ObjectID('AAAB'),name : 'goofy.example.com',ipaddr : '127.66.66.66'} 日志(logmsg):{time : ISODate("2014-03-28T09:42:41.382Z"),message : 'cpu is on fire!',host: ObjectID('AAAB')       // Reference to the Host document}

<span style="color: #333333; font-family: Arial; line-height: 26px; >我们在logsmg中,存放对host的_id引用即可。



综上所述,在对1 to n关系建模时,我们需要考虑:

1)n代表的数量级很小,且n代表的实体不需要单独操作时,可以采用嵌入式建模。

2)n代表的数量级比较大,或者n代表的实体需要单独进行操作时,采用在1中用Array存放引用的方式建模。

3)n代表的数量级非常大时,我们没有选择,只能在n端添加一个引用到1端。


原文地址:http://blog.csdn.net/zythy/article/details/33725981

推荐您阅读更多有关于“mongodb,”的文章

猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

  查看权限

抖音号:wpfui,可以看到我的很多作品效果

AYUI8社区版Github地址:前往获取

作者:杨洋(AaronYang简称AY,安徽六安人)目前是个人,还没公司AY唯一QQ:875556003和AY交流

高中学历,2015年1月17日开始,兴趣学习研究WPF

声明:AYUI7个人与商用免费,源码可购买。部分DEMO不免费.AY主要靠卖技术服务挣钱

不是从我处购买的ayui7源码,我不提供任何技术服务,如果你举报从哪里买的,我可以帮你转正为我的客户,并送demo

查看捐赠

AYUI7.X MVC教程 更新如下:

第一课 第二课 程序加密教程

兼容XP到win10,vs2015/2019,最新AYUI:7.6.5.2

vs2015 企业版密钥HM6NR-QXX7C-DFW2Y-8B82K-WTYJV

vs2017 企业版密钥NJVYC-BMHX2-G77MM-4XJMR-6Q8QF

标签列表