V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
sd4399340
V2EX  ›  问与答

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

  •  
  •   sd4399340 · 2012-04-16 15:35:33 +08:00 · 4062 次点击
    这是一个创建于 4611 天前的主题,其中的信息可能已经有所发展或是发生改变。
    以前问过一个问题,http://www.v2ex.com/t/27285

    现在还是这个问题,如果我使用Mongodb,然后“用户”作为一个modal,“商品”作为一个modal,那应该怎样描述用户收藏了商品这种多对多的关系呢,能用嵌入子文档实现吗?
    7 条回复    1970-01-01 08:00:00 +08:00
    acdea4effdbb420d
        1
    acdea4effdbb420d  
       2012-04-16 15:40:08 +08:00
    200
        2
    200  
       2012-04-16 16:06:32 +08:00
    其实思想上和关系数据库差不多,你可以给用户的文档添加一个子文档,把用户收藏的商品ID都保存在这个子文档中,查询的时候先从中提取商品ID,再根据商品ID检索商品信息。
    sd4399340
        3
    sd4399340  
    OP
       2012-04-16 17:17:35 +08:00
    @200 其实有点搞不清楚什么时候用embedding,什么时候用linking啊
    sd4399340
        4
    sd4399340  
    OP
       2012-04-16 17:19:10 +08:00
    @200 看官方文档意思感觉,linking就跟关系型数据库差不多啊,是吧?
    avatasia
        5
    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
        6
    200  
       2012-04-16 17:46:26 +08:00
    @sd4399340 用linking还是embedding取决两个对象之间的关系。

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

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

    其实选择linking还是embedding主要是看维护数据一致性时哪种方便,对于多对多的关系,就说你提到的例子,如果采用embedding来实现,那就会导致一个商品信息发生了变化,得遍历每一个用户,查找这个用户有没有收藏这个商品,如果有收藏,再对这个商品信息进行修改,效率很低。
    chloerei
        7
    chloerei  
       2012-04-16 17:57:52 +08:00
    用不用 embed 取决于是否有从属关系以及希不希望这些内容被一并读出
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2789 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 12:47 · PVG 20:47 · LAX 04:47 · JFK 07:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.