1. 程式人生 > >PHP 站內消息的表結構設計

PHP 站內消息的表結構設計

位置 數據 全文檢索 mar 性能問題 設計 如果 處理 default

1)添加全站通知:信息存入到 tb_message 2)用戶點開信息或者設置信息為已閱讀:插入記錄到 tb_message_readlog

如何設計存儲的表?求最佳方案


CREATE TABLE `message` (
    `message_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘消息id‘,
    `subject` varchar(250) NOT NULL DEFAULT ‘‘ COMMENT ‘主題‘,
    `content` varchar(500) NOT NULL DEFAULT ‘‘ COMMENT ‘內容‘,
    `type` tinyint(1) NOT NULL DEFAULT ‘0‘ COMMENT ‘消息類型 0 Message‘,
    `status` tinyint(1) NOT NULL DEFAULT ‘0‘ COMMENT ‘狀態 -1刪除 0默認‘,
    `create_time` int(10) unsigned NOT NULL DEFAULT ‘0‘ COMMENT ‘創建時間‘,
    PRIMARY KEY(`message_id`),
    KEY `subject` (`subject`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `message_broadcast` (
    `message_broadcast_id` bigint(20) NOT NULL AUTO_INCREMENT,
    `message_id` bigint(20) NOT NULL DEFAULT ‘0‘ COMMENT ‘消息id‘,
    `sender` bigint(20) NOT NULL DEFAULT ‘0‘ COMMENT ‘發送者‘,
    `receiver` bigint(20) NOT NULL DEFAULT ‘0‘ COMMENT ‘接收者‘,
    `is_read` tinyint(1) NOT NULL DEFAULT ‘0‘ COMMENT ‘狀態 0未讀 1已讀‘,
    PRIMARY KEY(`message_broadcast_id`),
    KEY `message_id` (`message_id`),
    KEY `sender` (`sender`),
    KEY `receiver` (`receiver`),
    KEY `is_read` (`is_read`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=‘消息廣播表‘;

大概思路跟你的差不多,這樣就可以滿足大部分的消息了

1.tb_message (id,content,fromUid,toUid [0表示全站用戶,>0表示發送給某個用戶])
2.tb_message_readlog (readLogId,messageId,uid,isread)

不過如果你的消息數據量比較大,建議你分表處理,可以根據用戶的id來分表,比如id=123456的用戶發送的消息就放到tb_message6,類似這樣的處理


消息表message:
編號 id
時間 date
標題 title
正文 content
未讀用戶 unread
接收用戶 receive
發送用戶 send

字段receive保存消息接收人的ID序列如1,2,3,4(用逗號分隔).
字段unread保存未閱讀消息的接收人的ID序列,unread初始值也為所有接收人,閱讀過消息的用戶則從中刪除掉.
可以用MySQL內部函數FIND_IN_SET(返回找到的位置,從1開始)進行查詢.
比如,查詢編號為2的用戶的未讀信息:

SELECT * FROM `message` WHERE FIND_IN_SET(‘2‘, `unread`);

或者使用全文檢索(需要對字段unread建立全文索引,ID序列用空格隔開,如1 2 3 4):

SELECT * FROM `message` WHERE MATCH(`unread`) AGAINST(‘2‘);

數據量比較大的話,FIND_IN_SET可能會存在性能問題,建議定時清理消息表過期的已經閱讀過的消息.

PHP 站內消息的表結構設計