NoSQL型的数据库怎样描述实体间的关系?

2012-04-16 15:35:33 +08:00
 sd4399340
以前问过一个问题,http://www.v2ex.com/t/27285

现在还是这个问题,如果我使用Mongodb,然后“用户”作为一个modal,“商品”作为一个modal,那应该怎样描述用户收藏了商品这种多对多的关系呢,能用嵌入子文档实现吗?
4082 次点击
所在节点    问与答
7 条回复
acdea4effdbb420d
2012-04-16 15:40:08 +08:00
200
2012-04-16 16:06:32 +08:00
其实思想上和关系数据库差不多,你可以给用户的文档添加一个子文档,把用户收藏的商品ID都保存在这个子文档中,查询的时候先从中提取商品ID,再根据商品ID检索商品信息。
sd4399340
2012-04-16 17:17:35 +08:00
@200 其实有点搞不清楚什么时候用embedding,什么时候用linking啊
sd4399340
2012-04-16 17:19:10 +08:00
@200 看官方文档意思感觉,linking就跟关系型数据库差不多啊,是吧?
avatasia
2012-04-16 17:37:13 +08:00
embedding ,linking这个专门研究过,在google group上也请教过别人。
如果你的数据侧重外联,不应该用mongodb,而是关系数据库。
nosql是用来处理博客,微博,日志等这种实时信息流,更改的动作不多。
embedding 查询效率高, 占用空间大, linking查询效率低,占用空间小。
embedding最典型的使用就是博客的评论, 像2.1出来的aggregate framework就是用来处理embedding数据的。
linking是1对1查询,如果你需要外联数据,需要在客户端查询DBRef对应的数据。在pymongo里有AutoReference这个语法糖,实际上也是做了一次查询。
200
2012-04-16 17:46:26 +08:00
@sd4399340 用linking还是embedding取决两个对象之间的关系。

对于1对多的关系,就像@avatasia 提到的博客评论,一篇博文对应多个评论,一个评论只属于一篇博文,这样就可以用embedding来实现。

但是对于你提到的用户和收藏商品之间,属于多对多的关系,所以最好还是用linking来实现。

其实选择linking还是embedding主要是看维护数据一致性时哪种方便,对于多对多的关系,就说你提到的例子,如果采用embedding来实现,那就会导致一个商品信息发生了变化,得遍历每一个用户,查找这个用户有没有收藏这个商品,如果有收藏,再对这个商品信息进行修改,效率很低。
chloerei
2012-04-16 17:57:52 +08:00
用不用 embed 取决于是否有从属关系以及希不希望这些内容被一并读出

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/32379

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX