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 站内消息的表结构设计的更多相关文章

  1. WebSocket实现站内消息实时推送

    关于WebSocket WebSocket是HTML5 开始提供的一种在单个TCP连接上进行全双工通讯的协议.什么是全双工?就是在同一时间可以发送和接收消息,实现双向通信,比如打电话.WebSocke ...

  2. php 站内搜索 多表 分页

    借鉴了:http://blog.chinaunix.net/uid-20787846-id-3488253.html 这篇文章 ,在此基础上增加了分页功能 <?php /* 关键字 */ $ke ...

  3. 站内信DB设计实现

    两年前,万仓一黍在博客园发了两篇关于站内信的设计实现博文,<群发"站内信"的实现>.<群发"站内信"的实现(续)>,其中阐述了他关于站内 ...

  4. 使用Ajax轮询模拟简单的站内信箱(消息管理)功能

    前一段时间项目需要写一个类似于站内信箱的消息管理的功能,由于对前端不是很熟悉,刚开始不知道怎么做,后来看了网上的方案,现模拟一个非常简单的消息管理. 我们首先看一下最终效果的样式,就是非常简单的一个样 ...

  5. 借助 Lucene.Net 构建站内搜索引擎(下)

    前言:上一篇我们学习了Lucene.Net的基本概念.分词以及实现了一个最简单的搜索引擎,这一篇我们开始开发一个初具规模的站内搜索项目,通过开发站内搜索模块,我们可以方便地在项目中集成站内搜索功能.本 ...

  6. ASP.NET 实现站内信功能(点对点发送,管理员群发)

    正好这段时间在研究这个功能,还是得感谢这位大神,没有他的引路,我就不可能把站内信做出来. http://www.cnblogs.com/grenet/archive/2010/03/08/168065 ...

  7. SNF开发平台WinForm之十四-站内发送系统信息-SNF快速开发平台3.3-Spring.Net.Framework

    1运行效果: 2开发实现: .组装站内信息发送实体对象. SNFService SNFService = new SNFService(); if (this.ucUser.SelectedIds ! ...

  8. Lucene.Net 站内搜索

    Lucene.Net 站内搜索 一  全文检索: like查询是全表扫描(为性能杀手)Lucene.Net搜索引擎,开源,而sql搜索引擎是收费的Lucene.Net只是一个全文检索开发包(只是帮我们 ...

  9. mysql 用户表结构设计,第三方登录

    说起用户表,大概是每个应用/网站立项动工(码农们)考虑的第一件事情.用户表结构的设计,算是整个后台架构的基石.如果基石不稳,待到后面需求跟进了发现不能应付,回过头来反复修改用户表,要大大小小作改动的地 ...

随机推荐

  1. php curl 发起get和post网络请求

    curl介绍 curl是一个开源的网络链接库,支持http, https, ftp, gopher, telnet, dict, file, and ldap 协议.之前均益介绍了python版本的p ...

  2. 使用Powershell开机启动隐藏窗口的程序

    1.打开注册表找到键值:计算机\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run 2.添加字符串值:StartJetSer ...

  3. Echarts使用一个图例legend实现全选和全部取消的功能

    1.修改legend的data值,在前面加上全选和全不选,data = ['全选','全不选',1,2,3] 2.监听 legendselectchanged事件 / 使用刚指定的配置项和数据显示图表 ...

  4. 一起了解 .Net Foundation 项目 No.3

    .Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. AutoMapper Au ...

  5. Django Auth组件->扩展用户

    Auth用户 1.声明用户表 djangauth/settings.py..............................AUTH_USER_MODEL = 'app01.UserInfo' ...

  6. DFC-3C和DFC-3B的区别和注意事项

    1.Product numbers:WS-F6K-DFC(=)WS-F6K-DFC3A(=)WS-F6K-DFC3B(=)WS-F6K-DFC3BXL(=)WS-F6K-DFC3C(=)WS-F6K- ...

  7. 在MyEclipse2017中配置JDK和Tomcat8.5

    在MyEclipse2017中配置Tomcat8.5: 首先,确保你已安装好JDK.Tomcat等 1.启动MyEclipse后,点击菜单栏的"Window": 2.为MyEcli ...

  8. FromBase64String 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符

    js前台: <input id="upload_img_input" v-on:change="onFileChange" type="file ...

  9. 【资源分享】Gmod-Expression2 - 自定义像素画生成

    *作者:BUI* 可自定义制作属于你的像素画(默认为Sans) 第77行的COLOR可编辑你想要的颜色(RGB值) 1,2,3,4分别代表第77行所定义的颜色(0代表不显示) 视频地址:传送链接 @n ...

  10. 设备驱动基础学习--poll

    使用非阻塞I/O的应用程序通常会使用select()和poll()系统调用查询是否可对设备进行无阻塞的访问,这两个系统调用最终又会引发设备驱动中的poll()函数被执行,所以我们的问题就集中到了如何编 ...