文档章节

站内信功能设计

jocky_li
 jocky_li
发布于 2014/04/07 23:33
字数 1335
阅读 146
收藏 9

  在很多网站系统(如CMS系统,SNS系统等),都有“站内信”的功能。
  “站内信”不同于电子邮件,电子邮件通过专门的邮件服务器发送、保存。而“站内信”是系统内的消息,说白了,“站内信”的实现,就是通过数据库插入记录来实现的。
  “站内信”有两个基本功能。一:点到点的消息传送。用户给用户发送站内信;管理员给用户发送站内信。二:点到面的消息传送。管理员给用户(指定满足某一条件的用户群)群发消息。点到点的消息传送很容易实现,本文不再详述。下面将根据不同的情况,来说说“站内信”的群发是如何实现的。
  第一种情况,站内的用户是少量级别的。(几十到上百)
  这种情况,由于用户的数量非常少,因此,没有必要过多的考虑数据库的优化,采用简单的表格,对系统的设计也来的简单,后期也比较容易维护,是典型的用空间换时间的做法。
  数据库的设计如下:表名:Message
  ID:编号;SendID:发送者编号;RecID:接受者编号(如为0,则接受者为所有人);Message:站内信内容;Statue:站内信的查看状态;PDate:站内信发送时间;
  如果,某一个管理员要给所有人发站内信,则先遍历用户表,再按照用户表中的所有用户依次将站内信插入到Message表中。这样,如果有56个用户,则群发一条站内信要执行56个插入操作。这个理解上比较简单,比较耗损空间。
  某一个用户登陆后,查看站内信的语句则为:
  Select * FROM Message Where RecID=‘ID’ OR RecID=0
  第二种情况,站内的用户中量级别的(上千到上万)。
  如果还是按照第一种情况的思路。那发一条站内信的后果基本上就是后台崩溃了。因为,发一条站内信,得重复上千个插入记录,这还不是最主要的,关键是上千乃至上万条记录,Message字段的内容是一样的,而Message有大量的占用存储空间。比方说,Message字段有100个汉字,占用200个字节,那么5万条,就占用200×50000=10000000个字节=10M。简单的一份站内信,就占用10M,这还让不让人活了。
  因此,将原先的表格拆分为两个表,将Message的主体放在一个表内,节省空间的占用
  数据库的设计如下:
  表名:Message
  ID:编号;SendID:发送者编号;RecID:接受者编号(如为0,则接受者为所有人);MessageID:站内信编号;Statue:站内信的查看状态;
  表名:MessageText 
  ID:编号;Message:站内信的内容;PDate:站内信发送时间;
  在管理员发一封站内信的时候,执行两步操作。先在MessageText表中,插入站内信的内容。然后在Message表中给所有的用户插入一条记录,标识有一封站内信。
  这样的设计,将重复的站内信的主体信息(站内信的内容,发送时间)放在一个表内,大量的节省存储空间。不过,在查询的时候,要比第一种情况来的复杂。
  第三种情况,站内的用户是大量级的(上百万),并且活跃的用户只占其中的一部分。
  大家都有这样的经历,某日看一个网站比较好,一时心情澎湃,就注册了一个用户。过了一段时间,由于种种原因,就忘记了注册时的用户名和密码,也就不再登陆了。那么这个用户就称为不活跃的。从实际来看,不活跃的用户占着不小的比例。
  我们以注册用户2百万,其中活跃用户只占其中的10%。
  就算是按照第二种的情况,发一封“站内信”,那得执行2百万个插入操作。但是其中的有效操作只有10%,因为另外的90%的用户可能永远都不会再登陆了。
  在这种情况下,我们还得把思路换换。
  数据库的设计和第二种情况一样:
  表名:Message
  ID:编号;SendID:发送者编号;RecID:接受者编号(如为0,则接受者为所有人);MessageID:站内信编号;Statue:站内信的查看状态;
  表名:MessageText 
  ID:编号;Message:站内信的内容;PDate:站内信发送时间;
  管理员发站内信的时候,只在MessageText插入站内信的主体内容。Message里不插入记录。
  那么,用户在登录以后,首先查询MessageText中的那些没有在Message中有记录的记录,表示是未读的站内信。在查阅站内信的内容时,再将相关的记录插入到Message中。
  这个方法和第二种的比较起来。如果,活跃用户是100%。两者效率是一样的。而活跃用户的比例越低,越能体现第三种的优越来。只插入有效的记录,那些不活跃的,就不再占用空间了。

本文转载自: http://www.php100.com/html/it/focus/2014/0404/6751.html

共有 人打赏支持
jocky_li
粉丝 0
博文 19
码字总数 8029
作品 0
浦东
程序员
站内信 设计

公司的电商平台要做个站内信。主要功能是给供货商、经销商、分销员这些身份的人发送消息。比如供货商修改了商品的价格、上架了商品等操作。需要通知到经销商。经销商可以在自己的站内信里搜寻...

冬瓜1
2016/01/21
81
0
设计篇--站内信设计思路之己见(基于上百万用户)

大家都知道站内信,分为少量(10-999用户),中量(1000-99999用户),大量(100W用户)不同的站内信架构,消耗存储空间,和效率也是不同的。 本人基于最大的架构,来于大家共同讨论,站内信...

Yomut
2016/08/29
88
0
请问OSCHINA的站内私信是怎么设计的?

oschina的站内信,可以看到所有与之有过来往的2个人的聊天记录.这个功能不错,比较直观. 数据库设计和查询时怎么做的啊?

funny-guy
2012/06/06
724
4
StartBBS v1.2.0 轻量微社区发布

StartBBS(烧饼开源微社区系统)是一个基于 PHP+MySQL MVC架构开发的新型微社区系统,她轻量小巧 简单易用,强大高效,又简称 "STB(烧饼)"。 前台 UI 采用当前流行的 Bootstrap 和 jQuery...

startbbs
2014/12/15
3K
8
java开源CMS系统-JEECMS v2012版发布

jeecms v2012版是一款集新闻管理、图库管理、视频管理、下载系统、作品管理、产品发布及留言板于一体的综合性CMS系统。从2012版起,jeecms将更注重用户体验、系统性能和实际应用的研发,让j...

jeecms
2011/12/20
3.9K
7

没有更多内容

加载失败,请刷新页面

加载更多

Django支持中文

django是支持中文界面, 先找到Django语言包安装目录,我的在: /usr/local/python3/lib/python3.6/site-packages/django/conf/locale 有zh-Hans和zh-Hant两个文件, 其中zh-Hans是简体中文,...

MichaelShu
26分钟前
1
0
迷宫问题:顺序栈解法

采用顺序栈以及回溯法,一个比较简单的问题,但是从来没有写过,也算是弥补一下自己欠数据结构的债吧,居然也花了一个半小时,无地自容了。。 定义好数据结构求解算法就显得容易一些了。 st...

LoSingSang
32分钟前
0
0
Zookeeper 概述及应用场景

一、概述 分布式协调技术,主要用来解决分布式环境当中多个进程之间的同步控制,让他们有序的去访问某种临界资源,防止造成"脏数据"的后果。 ZooKeeper是一个分布式的,开放源码的分布式应用...

PeakFang-BOK
40分钟前
1
0
(译)OpenGL ES2.0 – Iphone开发指引

教程截图: OpenGL ES 是可以在iphone上实现2D和3D图形编程的低级API。 如果你之前接触过 cocos2d,sparrow,corona,unity 这些框架,你会发现其实它们都是基于OpenGL上创建的。 多数程序员...

robslove
50分钟前
0
0
金九银十跳槽季,程序员面试点解析之Java专场

前言 近年来Java工程师这个岗位炙手可热,市场需求大,学习Java的人也越来越多,所以IT企业与求职者的选择都比较多,那么IT企业在面试时都会提哪些问题呢。下面为大家分享 Java高级工程师面试...

老道士
52分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部