站内信设计
逻辑实现
点对点(私信)
-
发送方 sender
-
接收方 receiver
-
状态 status
-
信息内容 message
-
信息分类 message_type
-
发送时间 created_at
点对点发送消息比较简单,每次发送为单表时插入 sender, receiver, message, created_at
(伪代码)
-
获取未读信息
select message from message where reveiver_id == 'user.id' and status = 'unread';
-
获取系统未读信息
select message from message where reveiver_id == 'user.id' and status = 'unread' and message_type = 'sys'
-
获取已读信息
status = 'read'
点对面(系统消息)
点对面实现不能像点对点一样为每一个用户创建一条数据(如果数以十万百万计) 具体实现看这里 http://www.cnblogs.com/grenet/archive/2010/04/09/1708008.html
简单讲一下我理解的逻辑(伪代码):
-
发送私信(点对点)
# 先保存消息主体内容 message_text = MessageText( sender = sender, message = message, message_type = message_type(私信) ) # 保存接受方,并关联消息主体 message = Message( message_text_id = message_text.id, receiver = receiver, status = 'unread' )
-
获取未读信息
messages = Message.query.filter_by(receiver = current_user,status = 'unread')
-
-
系统消息
# 只保存消息主体内容 message_text = MessageText( sender = sender, message = message, message_type = message_type(系统消息) )
-
获取未读信息 判断 message 表中 message_text_id 是否存在于 message_text_id__list (receiver = current_user)
不存在,标记为系统未读 存在,判断是否未读 -
获取具体未读信息 如上
不存在时# 保存消息 message = Message(receiver = current_user, status = 'read', message_text_id = message_text.id)
存在时,
message.status = 'read'
-
数据库设计
信息表(关联)
tablename: message
字段名 | 字段类型 | 字段描述 | 是否为空 | 是否unique | 默认值 |
---|---|---|---|---|---|
receiver_id | integer | 接收方外键ID | False | False | |
receiver | 接收方 | False | False | ||
message_text_id | integer | 站内信主体内容外键ID | False | False | |
message_text | 站内信主体内容 | False | False | ||
status | string | 站内信状态 | False | False | 0(未读) |
信息内容表
tablename: message_text
字段名 | 字段类型 | 字段描述 | 是否为空 | 是否unique | 默认值 |
---|---|---|---|---|---|
title | string(128) | 站内信标题 | False | False | |
content | text(1024) | 站内信内容 | False | False | |
message_type | string | 站内信类别 | False | False | 2(系统信息) |
sender_id | integer | 发送方外键ID | False | False | |
sender | 发送方 | False | False |