MST

星途 面试题库

面试题:MongoDB文档模型下如何设计高扩展性的多对多关系

假设你正在开发一个社交平台,用户与用户之间存在多对多的好友关系,且要支持用户发布动态,其他用户可以点赞、评论动态。基于MongoDB的文档模型,你将如何设计数据库结构以确保系统具有良好的扩展性,详细说明文档结构及关联方式。
31.6万 热度难度
数据库MongoDB

知识考点

AI 面试

面试题答案

一键面试

用户文档结构

{
    "_id": ObjectId("用户唯一标识"),
    "username": "用户名",
    "email": "邮箱",
    "password": "密码",
    "friends": [ObjectId("好友1的用户ID"), ObjectId("好友2的用户ID"), ...],
    "createdAt": ISODate("用户创建时间"),
    "updatedAt": ISODate("用户信息更新时间")
}
  • _id:每个用户的唯一标识,使用MongoDB自动生成的ObjectId。
  • username:用户的显示名称。
  • email:用户注册邮箱。
  • password:用户密码,建议使用加密存储。
  • friends:存储好友的用户ID数组,以实现多对多的好友关系。
  • createdAtupdatedAt:记录用户创建和信息更新的时间。

动态文档结构

{
    "_id": ObjectId("动态唯一标识"),
    "userId": ObjectId("发布动态的用户ID"),
    "content": "动态内容",
    "likes": [ObjectId("点赞用户1的ID"), ObjectId("点赞用户2的ID"), ...],
    "comments": [
        {
            "userId": ObjectId("评论用户ID"),
            "content": "评论内容",
            "createdAt": ISODate("评论创建时间")
        },
        // 更多评论
    ],
    "createdAt": ISODate("动态发布时间"),
    "updatedAt": ISODate("动态更新时间")
}
  • _id:动态的唯一标识。
  • userId:发布该动态的用户ID,通过此ID关联到用户文档。
  • content:动态的具体内容。
  • likes:点赞用户的ID数组。
  • comments:评论数组,每个评论对象包含评论用户ID、评论内容和评论创建时间。
  • createdAtupdatedAt:记录动态发布和更新的时间。

关联方式

  1. 用户与好友关系:通过用户文档中的friends数组,存储好友的用户ID,实现多对多关系。比如用户A的friends数组中有用户B的ID,同时用户B的friends数组中也有用户A的ID,表示A和B互为好友。
  2. 用户与动态关系:动态文档中的userId关联到发布该动态的用户文档的_id,从而确定动态的发布者。
  3. 动态与点赞用户关系:动态文档中的likes数组存储点赞用户的ID,这些ID对应到用户文档的_id,表明哪些用户对该动态进行了点赞。
  4. 动态与评论用户关系:动态文档的comments数组中每个评论对象的userId关联到评论用户文档的_id,用于确定评论者身份。

这样的数据库结构设计在MongoDB中可以很好地适应社交平台业务逻辑的变化,具有良好的扩展性。比如新增一种互动类型(如分享),只需在动态文档中增加相应字段即可,无需更改整个数据库模式。