站内短消息的设计

需要注意的点: 
1、站内信可以是点对点发,也可以是群发,但发件人永远只有一个。 
2、发件人需要知道信是否已读 
3、删除的时候,如果发件人把信删了,收件人的信不能丢失 
create table message_board {
    id                  long,
    sender_id           long,
    receiver_id         long,
    send_time           datetime,
    read_time           datetime,
    sender_deleted      tinyint(1),
    receiver_deleted    tinyint(1),
    etag                char(8),         // 同一封群发邮件的标识,非群发为 null
    title               varchar(250),
    content             text,
    primary key(id)
}

发件箱:select * from message_board where sender_id=? and sender_deleted=0;
收件箱:select * from message_board where receiver_id=? and receiver_deleted=0;

1. 点对点,一条数据足够
2. 群发N人,需要插入N+1条数据
    1条: sender_id=?, receiver_id=null, receiver_deleted=1, etag=?
    N条: sender_id=?, receiver_id=?, sender_deleted=1, etag=?

3. 群发邮件的所有接收人
    select * from message_board where receiver_id is not null and etag=?;

对于删除邮件,可能时间长了,会有一些收、发件人都删除的无用邮件存在。可以定期运行一断脚本来清理无效邮件,或者直接在删除的时候判断是否双方都删除了邮件。 

对于用户量很大的网站,群发邮件会存在大量重复的内容。这时候,将原先的表格拆分为两个表,将将 title 和 content 放在另外一个表内,节省空间的占用,然后在主表上进行引用就可以了。不过就是要多进行一次SQL查询或者执行关联查询。




你可能感兴趣的:(站内短消息的设计)