1)添加全站通知:信息存入到 tb_message 2)用户点开信息或者设置信息为已阅读:插入记录到 tb_message_readlog

如何设计存储的表?求最佳方案


  1. CREATE TABLE `message` (
  2. `message_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '消息id',
  3. `subject` varchar(250) NOT NULL DEFAULT '' COMMENT '主题',
  4. `content` varchar(500) NOT NULL DEFAULT '' COMMENT '内容',
  5. `type` tinyint(1) NOT NULL DEFAULT '0' COMMENT '消息类型 0 Message',
  6. `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态 -1删除 0默认',
  7. `create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
  8. PRIMARY KEY(`message_id`),
  9. KEY `subject` (`subject`)
  10. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  11. CREATE TABLE `message_broadcast` (
  12. `message_broadcast_id` bigint(20) NOT NULL AUTO_INCREMENT,
  13. `message_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '消息id',
  14. `sender` bigint(20) NOT NULL DEFAULT '0' COMMENT '发送者',
  15. `receiver` bigint(20) NOT NULL DEFAULT '0' COMMENT '接收者',
  16. `is_read` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态 0未读 1已读',
  17. PRIMARY KEY(`message_broadcast_id`),
  18. KEY `message_id` (`message_id`),
  19. KEY `sender` (`sender`),
  20. KEY `receiver` (`receiver`),
  21. KEY `is_read` (`is_read`)
  22. ) 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的用户的未读信息:

  1. SELECT * FROM `message` WHERE FIND_IN_SET('2', `unread`);

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

  1. 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. Linux package installation: deb and rpm

    一般来说著名的 Linux 系统基本上分两大类: RedHat 系列:Redhat.Centos.Fedora 等 Debian 系列:Debian.Ubuntu 等 Dpkg (Debian系): ...

  2. 操作系統3-內存管理(Linux內存管理)

    操作系統3-內存管理(Linux系統的內存管理方法) 9.Linux系統的內存管理方法 Linux採用"按需調頁"算法,支持三層管理策略.由於Intel CPU在硬件級提供了段式存 ...

  3. java&python使用对比的浅析

    本人写了一段时间java了,最近半年在写python,遂想将其使用中的共同点和异同点整理出来,方便自己和大家学习. 两者的本质区别,请参考如下别人写的帖子: https://blog.csdn.net ...

  4. spring(一):思维导图

  5. MVC5+EF6 入门完整教程4 :EF基本的CRUD

    上篇文章主要讲了如何配置EF, 我们回顾下主要过程: 创建Data Model ---> 创建Database Context --->创建databaseInitializer---&g ...

  6. 「口胡题解」「CF965D」Single-use Stones

    目录 题目 口胡题解 题目 有许多的青蛙要过河,可惜的是,青蛙根本跳不过河,他们最远只能跳 \(L\) 单位长度,而河宽 \(W\) 单位长度. 在河面上有一些石头,距离 \(i\) 远的地方有 \( ...

  7. beego登录退出与检查登录过滤器

    // ShowLogin 登陆显示 func (c *UserController) ShowLogin() { username := c.Ctx.GetCookie("username& ...

  8. Apache Kafka(一)- Kakfa 简介与术语

    Apache Kafka 1. Kafka简介.优势.以及使用场景 Kafka的优势: 开源 分布式,弹性架构,fault tolerant 水平扩展: 可以扩展到100个brokers 可以扩展到每 ...

  9. selenium的定位方法-多元素定位

    在实际工作中,有些时候定位元素使用ID.NAME.CLASS_NMAE.XPATH等方法无法定位到具体元素,会发现元素属性有很多一致的,这个时候使用单元素定位方法无法准确定位到具体元素,例如,百度首页 ...

  10. SSI注入漏洞

    简介 SSI是英文Server Side Includes的缩写,翻译成中文就是服务器端包含的意思.从技术角度上说,SSI就是在HTML文件中,可以通过注释行调用的命令或指针.SSI具有强大的功能,只 ...