V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
BoarBoar
V2EX  ›  程序员

请教各位大佬一个 mongoDb 表设计的问题,是否应该使用内嵌数组

  •  
  •   BoarBoar · 2020-11-13 23:27:57 +08:00 · 1843 次点击
    这是一个创建于 1230 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需求在一张表中每次写入相关联的数千条数据,这些关联数据使用同一个 id 来标识。 写入之后不会改动,只需要查询或删除。

    请问这种情况,是应该使用类似 sql 表的形式,写入同一 id 的数千条数据 [id:abc,field1:xxx,...,filedn:xxx] [id:abc,field1:xxx,...,filedn:xxx] . . . [id:abc,field1:xxx,...,filedn:xxx]

    还是使用 mongo 的内嵌数组在比较好呢 id:abc, data:[ {field1:xxx,...,filedn:xxx}, . . . {field1:xxx,...,filedn:xxx}, ]

    主要是需要考虑查询效率,如果按第一种设计数据量可能是亿级别的,用 id 查询依然十分费劲 对 mongo 不太了解。1.不知道内嵌数组的性能可靠不 2.不知道用 id 建立索引后,用 id 查询是否依然会去扫内嵌的数千条数据,如果依然扫似乎不会比第一种效率高 跪求大神指点迷津

    9 条回复    2020-11-14 15:00:29 +08:00
    syzh
        1
    syzh  
       2020-11-14 08:05:51 +08:00 via iPhone
    第二种方式比较好吧,第一种方式的话,不如用 mysql 分库分表的方案了。以及第二种方式用 id 查询,为什么会扫内嵌的数据..
    xuanbg
        2
    xuanbg  
       2020-11-14 08:31:51 +08:00
    查询居多用内嵌
    teawithlife
        3
    teawithlife  
       2020-11-14 08:35:59 +08:00
    肯定选第二种,这是 mongoDB 的优势,也是推荐用法,效率会有极大的提升
    myCupOfTea
        4
    myCupOfTea  
       2020-11-14 11:02:37 +08:00
    @syzh 盲猜,也有其他查询条件
    TJT
        5
    TJT  
       2020-11-14 11:21:01 +08:00
    取决于内嵌数组中的数据会不会有跨文档的查询需求, 如果有且需求不固定, 那还是第一种比较好, 另外单个文档最大 16MB.

    MongoDB 嵌套文档的性能很好, 只要你的设计合理.
    BoarBoar
        6
    BoarBoar  
    OP
       2020-11-14 12:00:34 +08:00
    @syzh
    @xuanbg
    @teawithlife
    @myCupOfTea
    谢谢各位,其实我心里也倾向第二种,只是 mongo 用得少想确认一下,多谢了
    BoarBoar
        7
    BoarBoar  
    OP
       2020-11-14 12:03:27 +08:00
    @TJT 好的,是固定的,我就是想试试 mongo 这个特性,但是毕竟是公司的怕出问题背锅😂 所以就来问问了
    tangtj
        8
    tangtj  
       2020-11-14 12:54:28 +08:00
    内嵌数组中的数据会不会变大很大。我们遇到了一个问题,一个字段是嵌套数组,数组内容是一直在增加的。时间长了之后,有些数组开始有十几万个元素,部分查询没有排除掉这个字段,即使没有使用上这个字段但是依然被查询了出来,内网带宽使用巨大,没能把所有查询都找出来强制排除掉这个字段。最后把数据全部迁出来了,重构了需要使用这个字段的代码,把内嵌数组字段直接清空了。内网带宽用量从接近 Gb/s 下降到了 十几 Mb/s . 当然这是使用和设计上的问题,不得不说,Mongodb 是真的强。
    BoarBoar
        9
    BoarBoar  
    OP
       2020-11-14 15:00:29 +08:00
    @tangtj 需求不变的话数组内就不会增加😂 ,感谢这个踩坑经验,目前考虑的是做 2 张关联表,其他字段放概要表随便查,数组用一个 id 和概要表关联需要时再查。
    mongo 给我最大的感受是自由度高很多且并没有降低可维护性,就像我从 java 转 go 时一样,感受就是也许不需要太过度设计,一样能实现优秀的系统的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4963 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 09:48 · PVG 17:48 · LAX 02:48 · JFK 05:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.