第13章IM服务——13.4 存储初探

第13章IM服务——13.4 存储初探
John Yaml13.4 存储初探
一个支持读扩散模式和写扩散模式的完整IM服务应该存储哪些数据?本节我们先做一个简单的介绍。本节内容可以作为后续章节的导论。
用户发送的消息显然应该被存储到消息表中,其具体属性如下。
- 消息ID:全局唯一标识一条消息。
- 发送时间:接收者可以看到消息是什么时间发送的。
- 内容:记录消息文本。
- 会话ID:指向消息所属的会话。
- 发送者ID:指向消息发送者的用户ID。
- 状态:记录消息是否对接收者可见,比如消息是否被屏蔽、被撤回。
用户聊天的渠道是会话,会话也应该被保存,尤其是群聊会话。
- 会话ID:全局唯一标识一个会话。
- 会话类型:会话是单聊会话还是群聊会话。
- 最新消息时间:记录会话中最新消息的发送时间。
- 会话人数:与会话相关的用户数量。单聊会话人数固定为2人 ,群聊会话人数为群组成员总人数。
- 其他群组信息:如群头像、群公告等。
为了支持读扩散模式,对于每个会话都应该存储此会话与其产生的消息的关联关系, 即“会话消息链”,这条链中的每条数据都应该包含如下属性。
- 会话ID:指代一个会话。
- 消息ID:指代属于此会话的一条消息。
同理,为了支持写扩散模式,对于每个用户也都应该存储此用户与其需要接收的消息的关联关系,即“用户消息链”,这条链中的每条数据都应该包含如下属性。
- 用户ID:指代一个用户。
- 消息ID:指代此用户应该接收的消息。
- 会话ID:指代应该接收的消息所属的会话。
此外,对于每个会话都应该知道聊天的用户有哪些,且每个用户都应该有自己针对每个关联会话的设置,因此还需要保存会话与用户的关联关系,即“用户会话链”,这条链中的每条数据都至少要包含如下属性。
- 会话ID:指代一个会话。
- 用户ID:指代哪个用户属于此会话。
- 会话通知:用户可以选择强提醒,或者屏蔽此会话的消息。
- 置顶:用户可以选择是否将此会话在聊天列表的顶部优先展示。
以上介绍的是明显需要存储的数据。但是目前每条数据的属性不一定是完整的,而且为了支持完整的IM服务功能,可能还需要其他数据。这些细节我们将在后续章节中讲解,并在13.8节中介绍最终的存储设计。