站内信设计
逻辑实现
点对点(私信)
- 发送方
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 | 
