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

2020-11-13 23:27:57 +08:00
 BoarBoar

需求在一张表中每次写入相关联的数千条数据,这些关联数据使用同一个 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 查询是否依然会去扫内嵌的数千条数据,如果依然扫似乎不会比第一种效率高 跪求大神指点迷津

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

MongoDB 嵌套文档的性能很好, 只要你的设计合理.
BoarBoar
2020-11-14 12:00:34 +08:00
@syzh
@xuanbg
@teawithlife
@myCupOfTea
谢谢各位,其实我心里也倾向第二种,只是 mongo 用得少想确认一下,多谢了
BoarBoar
2020-11-14 12:03:27 +08:00
@TJT 好的,是固定的,我就是想试试 mongo 这个特性,但是毕竟是公司的怕出问题背锅😂 所以就来问问了
tangtj
2020-11-14 12:54:28 +08:00
内嵌数组中的数据会不会变大很大。我们遇到了一个问题,一个字段是嵌套数组,数组内容是一直在增加的。时间长了之后,有些数组开始有十几万个元素,部分查询没有排除掉这个字段,即使没有使用上这个字段但是依然被查询了出来,内网带宽使用巨大,没能把所有查询都找出来强制排除掉这个字段。最后把数据全部迁出来了,重构了需要使用这个字段的代码,把内嵌数组字段直接清空了。内网带宽用量从接近 Gb/s 下降到了 十几 Mb/s . 当然这是使用和设计上的问题,不得不说,Mongodb 是真的强。
BoarBoar
2020-11-14 15:00:29 +08:00
@tangtj 需求不变的话数组内就不会增加😂 ,感谢这个踩坑经验,目前考虑的是做 2 张关联表,其他字段放概要表随便查,数组用一个 id 和概要表关联需要时再查。
mongo 给我最大的感受是自由度高很多且并没有降低可维护性,就像我从 java 转 go 时一样,感受就是也许不需要太过度设计,一样能实现优秀的系统的

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

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

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

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

© 2021 V2EX