当前位置: 首页 > news >正文

MongoDB数据建模小案例

MongoDB数据建模小案例

朋友圈评论内容管理

需求

社交类的APP需求,一般都会引入“朋友圈”功能,这个产品特性有一个非常重要的功能就是评论体系。

先整理下需求:

  • 这个APP希望点赞和评论信息都要包含头像信息:
    1. 点赞列表,点赞用户的昵称,头像;
    2. 评论列表,评论用户的昵称,头像;
  • 数据查询则相对简单:
    1. 根据分享ID,批量的查询出10条分享里的所有评论内容;

建模

不好的设计

跟据上面的内容,先来一个非常非常"朴素"的设计:

{  "_id": 41,  "username": "小白",  "uid": "100000",  "headurl": "http://xxx.yyy.cnd.com/123456ABCDE",  "praise_list": [    "100010",    "100011",    "100012"  ],  "praise_ref_obj": {    "100010": {      "username": "小一",      "headurl": "http://xxx.yyy.cnd.com/8087041AAA",      "uid": "100010"    },    "100011": {      "username": "mayun",      "headurl": "http://xxx.yyy.cnd.com/8087041AAB",      "uid": "100011"    },    "100012": {      "username": "penglei",      "headurl": "http://xxx.yyy.cnd.com/809999041AAA",      "uid": "100012"    }  },  "comment_list": [    "100013",    "100014"  ],  "comment_ref_obj": {    "100013": {      "username": "小二",      "headurl": "http://xxx.yyy.cnd.com/80232041AAA",      "uid": "100013",      "msg": "good"    },    "100014": {      "username": "小三",      "headurl": "http://xxx.yyy.cnd.com/11117041AAB",      "uid": "100014",      "msg": "bad"    }  }}

可以看到,comment_ref_obj与praise_ref_obj两个字段,有非常重的关系型数据库痕迹,猜测,这个系统之前应该是放在了普通的关系型数据库上,或者设计者被关系型数据库的影响较深。而在MongoDB这种文档型数据库里,实际上是没有必要这样去设计,这种建模只造成了多于的数据冗余。

另外一个问题是,url占用了非常多的信息空间,这点在压测的时候会有体现,带宽会过早的成为瓶颈。同样username信息也是如此,此类信息相对来说是全局稳定的,基本不会做变化。并且这类信息跟随评论一起在整个APP中流转,也无法处理”用户名修改“的需求。

根据这几个问题,重新做了优化的设计建议。

推荐的设计
{  "_id": 41,  
http://www.lryc.cn/news/500883.html

相关文章:

  • MySQL(库的操作)
  • 【55 Pandas+Pyecharts | 实习僧网Python岗位招聘数据分析可视化】
  • java中23种设计模式的优缺点
  • 【JavaEE】多线程(7)
  • 如何高效的向AI大模型提问? - 提示工程Prompt Engineering
  • 4K高清壁纸网站推荐
  • EasyExcel注解使用
  • Visual Basic 6 关于应用的类库 - 开源研究系列文章
  • C#泛型
  • go语言的成神之路-标准库篇-fmt标准库
  • React Native的router解析
  • Linux update-alternatives 命令详解
  • 【踩坑】修复报错libcurl.so.4、LIBFFI_BASE_7.0、libssl.so.3
  • python网络爬虫基础:html基础概念与遍历文档树
  • 【已解决】MacOS上VMware Fusion虚拟机打不开的解决方法
  • 经典视觉神经网络1 CNN
  • 一些硬件知识【2024/12/6】
  • 网络安全法-网络安全支持与促进
  • 【Docker】如何在Docker中配置防火墙规则?
  • Cesium 问题: 添加billboard后移动或缩放地球,标记点位置会左右偏移
  • 使用Python3 连接操作 OceanBase数据库
  • SpringBoot该怎么使用Neo4j - 优化篇
  • Flutter如何调用java接口如何导入java包
  • Redis 数据结构(一)—字符串、哈希表、列表
  • day1:ansible
  • 如何设置Java爬虫的异常处理?
  • 阿里云盘permission denied
  • 在 Ubuntu 24 上安装 Redis 7.0.15 并配置允许所有 IP 访问
  • 构建高效可靠的分布式推理系统:深入解析控制器与模型服务的协同工作
  • springboot394疫情居家办公系统(论文+源码)_kaic