私信功能
来源:互联网 发布:软件项目风险管理论文 编辑:程序博客网 时间:2024/05/21 09:42
最近在做一个私信的功能
一张message表:存储消息内容和创建者id;一张user_message表:存储发送者、接收者及消息id
本以为考虑还算周全,今天又查看了一些文章,发现还是差的远。 下面是从OSChina转来的一篇文章,比我设计的要高明得多。
转自:http://www.oschina.net/question/12_70252
OSChina 的留言表 osc_msgs ,表结构如下:
字段说明:
id : 留言主键字段,自增长
user : 留言的主人
friend : 对方的ID
sender : 留言发送者
receiver : 留言接收者
type : 留言类型(普通消息、系统消息)
content : 留言内容
send_time : 发送时间
read_time : 阅读时间
status : 留言状态
其中 user 和 friend 稍显特殊,其他的字段意义已非常明确不再说明。
当 A 给 B 发送一条留言时,会往 osc_msgs 表中插入两条相同的记录,唯一不同的是 user 和 friend 这两个字段的值是对调的,当然 id 因为是自增长的所以也不同。
为什么要这么做?
1. 一条留言保存两条记录:因为每个人都有收到的留言和已发送留言,当发送人删除了已发送留言,不会影响到接收人查看收到的留言
2. user/friend/sender/receiver 这四个字段是不是多余?
关键的问题就在于此,你还记得 osc 的留言箱吗?进入留言箱里显示的是你最近的留言往来,包含你接收到的和你发出的,它们是按照时间进行排序的。
假设只有 sender/receiver 这两个字段,那么要将接收和发送的留言放在一起,就必须用 UNION 来合并两个查询结果,然后再做排序,而且你还必须有个字段来标注到底是接收到的留言还是发出的留言。这样的 SQL 可能会是这样:
SELECT
*
FROM
(
SELECT
*
FROM
osc_msgs
WHERE
type=<接收>
AND
receiver=<我>
UNION
SELECT
*
FROM
osc_msgs
WHERE
type=<发送>
AND
sender=<我>
) t
ORDER
BY
send_time
DESC
这样的 SQL 语句不用执行都知道性能很差。
那么以冗余来换性能的思路,我们对这个表进行了小改造。
增加两个字段 user 和 friend,当 A 发送留言给 B 时,会写入两条记录:
记录1. user=A,friend=B,sender=A,receiver=B
记录2. user=B,friend=A,sender=A,receiver=B
再来看看在新的表结构下,我们如何改写上面的语句:
SELECT
*
FROM
osc_msgs
WHERE
user
= <我>
ORDER
BY
id
DESC
这两个 SQL 语句孰优孰劣,相信大家能比较得出来。
如果是要列出我跟每个人的最后一条留言的话(就好象留言箱首页显示的内容)可以这样写 SQL 语句:
SELECT
MAX
(id)
AS
id,
COUNT
(id)
AS
msgCount
FROM
osc_msgs
WHERE
user
= ?
GROUP
BY
friend
ORDER
BY
id
DESC
解释完毕。
本文只是提供一种表结构设计的参考思路,这也不是放之四海而皆准的方法,关键的问题在于你想解决什么样的问题,对 OSC 来说性能很重要,如果能简单的通过冗余来提升性能,这很划算。
- 私信功能
- 阅后即焚-来往私信特色小功能
- 私信、留言功能的数据库设计
- 私信功能方案一(一张表)
- resin4.0.44+websocket 实现私信功能服务端消息推送
- 总是有种csdn的私信功能出错了的感觉
- Instagram推新私信功能Direct:支持照片、视频和文本信息
- 仿新浪微博功能私信,离线下载,多图发布,离线编辑,定时发布
- 评论和私信
- 私信基本功能数据库设计
- 微软小冰微博私信接口
- 熟人之间的匿名社交还有什么玩法?“偷偷”加入@提醒和阅后即焚私信功能,让定向信息流动更顺畅
- 我账号的私信总是被删,请勿私信联系
- 有个朋友的私信
- 用socket.io发私信
- php 环信发送私信
- Subjot: 没有私信、没有分享的Twitter
- 微信或百度私信的效果
- Git介绍与安装
- 微信开发之群发接口
- opencv例程分析(1)
- thymeleaf
- Cocos Creator 中iOS添加-ObjC时报错
- 私信功能
- 表单提交,下拉选项写法
- [计网学习笔记(3)] Email应用
- TF-IDF与余弦相似性的应用(一):找出相似文章
- 《学习OpenCV》课后习题解答5
- 520来报到
- 'Debug/TestAESCipher.pch' is not a precompiled header file created with this compiler
- spark LDA 训练和预测
- oracle over partition by用法