一个论坛系统用mongdb数据库,帖子里面的回帖采用内嵌文档的形式,插入在帖子的文档里。这样频繁插入会有问题吗

    Model One-to-Many Relationships with Embedded Documents

    上面是mongoDB官方文档中,使用嵌入文档来建模oneToMany说的很透彻。

    这种做法比较折腾,精心设计会有效率提升。 要做如下考虑:

    一个文档太大不行,上限只有16M。如果超出16M的找补方案可能不美好。

    如果全部回帖都在一个文档里,但是你的回帖会分页显示,每次只取一个文档中的较小一段数据,效率也不美好。(假设文档10M,你每次只取里面数据的10K,9.99M数据都白读了)

    最好是: 每次请求只读一个文档,每个文档刚好就是你全部需要的数据,不多不少。

    结合论坛的业务特征,给你建议一个比较折腾的方案:

    主贴单独保存,毕竟你要显示帖子列表。如果回帖内嵌在主题里,显示帖子列表这个操作比较耗油。(只要标题发帖人时间等少量数据,一大堆其它数据都要从磁盘里读出来。)

    回帖”分包“保存。假设你回帖分页展示,每页20条,将第1到第20条存入一个文档,将第21到第40个存入第二个文档…

    将上面的”分包回帖“文档的ID存入主贴。

    显示帖子内容的时候,将”分包回帖“的所有ID一起返回给前端,前端在请求回帖数据自己组装页面(第一次取最新两个分包的内容,因为最新的一个分包一般情况是不足一页的)。

    论坛和主贴的关系也是一对多,帖子列表也可以用这个方法优化。

    另外的考虑:
    当前每页显示20条回帖,哪天产品经理改成25条怎么办?”分包回帖“文档要不直接100个回帖一包?!