为了账号安全,请及时绑定邮箱和手机立即绑定

有关MongoDB数据库设计的问题

有关MongoDB数据库设计的问题

MMMHUHU 2019-04-09 20:24:00
问题一:是否collection越少越好,尽量把关系数据库中分表表示的关系嵌套进文档里?问题二:如果这样的话,一句SQL能搞定的复杂查询,mongodb也许要查询多次。mongodb的查询速度是否还比sql数据库快?问题三:那mongodb的优势体现在哪?超大规模数据的mapreduce?方便拓展?我来举个栗子吧:假设mysql中是这样的(意思意思):authors(intid,charname,intage,charemail)articles(intid,chartitle,charcontent,longviewCount,intauthor_id)那么MongoDB中就可能是这个样子:只有一个authorscollectionauthor{_id:newObectID("blublublu"),name:'portwatcher',age:'19',email:'root@pwhack.me',articles:[{title:'youguess',content:'Iamcontent',viewCount:52345},...]}问题来了,如果我要单独查出所有作者的文章,并按浏览量来排序,要如何做?于是有了第二种设计方法,这也是nosql=notonlysql的体现。有authors和articles两个collectionauthor{_id:newObectID("blublublu"),name:'portwatcher',age:'19',email:'root@pwhack.me'}article{_id:newObjectID("lalalala"),title:'youguess',content:'Iamcontent',viewCount:52345,author_id:'blublublu'}现在的问题是,如果我要把文章和作者的名字一起返回要怎么办?1.是不是要查两次,连两次?如果连一次的话,有一些paas是不支持的(比如说bae,亲测不支持)。这样是否有失优雅?2.如果在article里存一份author.name的话,当某个作者改了名字,文章显示的作者名将无法更新,如果硬要一起更新,开销是否太大?3.DBRef何时用比较合适?在这里,要怎么用?在这里栗子中,总结一下我们需要的东西:所有作者旗下的文章可以全部聚合返回,并按某种方式排序文章可以和与之匹配的作者名一起返回作者可以编辑自己的资料文章和作者都可以单独插入可能比较啰嗦,大家谅解。要是有人能总结一下mongodb数据库设计的一些原则就更好了~
查看完整描述

2 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

mongodb不是rdbms。你尽可以随意发起任何select类型查询。比如
for($i=0,$j<100000000;$i<$j;$i++)
$author=$mongo->getCollection('db','table')->findOne(array('author_id'=>id),array('author_name'=>1));
echo$author['author_name'];
mysql,这样你就是疯了。mongodb,这样,很好。
你要根本的观念上认为:mongodb是绝对有别于MySQL的。
当然,不可否认的是,查询越少越好--#
                            
查看完整回答
反对 回复 2019-04-09
?
胡说叔叔

TA贡献1804条经验 获得超8个赞

MongoDB有个叫DBRef的功能,可以引用另一个集合甚至另一个数据库里的记录,但目前这个功能在某些语言的驱动中支持还不是很好,不是很推荐,至于教程,应该可以搜到不少吧。
至于数据库结构的设计,我认为应该从查询的角度来设计,你希望以后做什么样的查询,就怎样设计数据库。
比如如果你每次获取作者的时候都需要他的所有文章,就可以考虑第一种设计。
就作者和文章这个例子而言,我觉得采用第二种好一些。确实需要查两次数据库,但是你可以通过更高速的缓存,比如Memcache来减少查询作者的那一次查询,因为毕竟作者的更新频率要低一些。
                            
查看完整回答
反对 回复 2019-04-09
  • 2 回答
  • 0 关注
  • 309 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号