面试题答案
一键面试用户文档结构
{
"_id": ObjectId("用户唯一标识"),
"username": "用户名",
"email": "邮箱",
"password": "密码",
"friends": [ObjectId("好友1的用户ID"), ObjectId("好友2的用户ID"), ...],
"createdAt": ISODate("用户创建时间"),
"updatedAt": ISODate("用户信息更新时间")
}
_id
:每个用户的唯一标识,使用MongoDB自动生成的ObjectId。username
:用户的显示名称。email
:用户注册邮箱。password
:用户密码,建议使用加密存储。friends
:存储好友的用户ID数组,以实现多对多的好友关系。createdAt
和updatedAt
:记录用户创建和信息更新的时间。
动态文档结构
{
"_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、评论内容和评论创建时间。createdAt
和updatedAt
:记录动态发布和更新的时间。
关联方式
- 用户与好友关系:通过用户文档中的
friends
数组,存储好友的用户ID,实现多对多关系。比如用户A的friends
数组中有用户B的ID,同时用户B的friends
数组中也有用户A的ID,表示A和B互为好友。 - 用户与动态关系:动态文档中的
userId
关联到发布该动态的用户文档的_id
,从而确定动态的发布者。 - 动态与点赞用户关系:动态文档中的
likes
数组存储点赞用户的ID,这些ID对应到用户文档的_id
,表明哪些用户对该动态进行了点赞。 - 动态与评论用户关系:动态文档的
comments
数组中每个评论对象的userId
关联到评论用户文档的_id
,用于确定评论者身份。
这样的数据库结构设计在MongoDB中可以很好地适应社交平台业务逻辑的变化,具有良好的扩展性。比如新增一种互动类型(如分享),只需在动态文档中增加相应字段即可,无需更改整个数据库模式。