`
xttifqqk
  • 浏览: 49153 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

[转]百万级用户量的站内信群发数据库设计

 
阅读更多

随着WEB2.0的发展,用户之间的信息交互也变得十分庞大,而且实时性要求越来越高。现在很多SNS网站和一部分CMS网站都广泛地应用了站内信 这一模块,这个看似简单的东西其实背后隐藏着很多需要设计师重视的设计细节,要做好这个“邮递员”是很不容易的。为什么这么说呢?下面我们就一步步来探索 设计一个百万级用户量的站内信群发 数据库,看完以后你就会明白什么是真正可靠高效的“邮递员”。

1、几十——几百的用户量

这样的网站规模最小,可能是一个中小企业的CMS系统,面对这样的用户量,我们就不必要考虑短消息数据量太大的问题了,所以按照怎么方便怎么来的原 则,群发就每人复制一条消息数据,这样用户可以自己管理自己的消息,可以非常方便进行“已读、未读、删除”等操作。按照这个思路,我们的数据库设计如下:

表T_Message

1
2
3
4
5
6
Id            bigint       --消息ID
SenderId      bigint       --发送者ID
ReceiverId    bigint       --接收者ID
SendTime      datetime    --发送时间
ReadFlag      tinyint     --已读标志
MessageText   text        --消息正文

这样,我们接受自己的消息时只要做如下查询:

1
SELECT * FROM T_Message WHERE ReceiverId=myid

查询自己的未读消息只要做如下查询:

1
SELECT * FROM T_Message WHERE ReceiverId=myid and ReadFlag=0

这种方法很简单,可能是我们第一个想到的,对于这样的用户量的情况这样的设计确实也足够了。

 

2、几千——几万的用户量

用户量到了这样的级哦别,这个网站应该算是比较大了,笔者估计,可能是一个地区性的SNS网站。那么面对这样的用户量,我们又该如何来设计站内信群 发呢?上面第一种思路还行得通吗?应该这样说,如果勉强要用上面那种设计,也是可以的,只不过T_Message可能要考虑分区。但是,大家会不会觉得消 息正文复制那么多条对于这样的用户量来讲空间浪费太大,因为考虑到接收者一般是不修改消息正文的,所以我们可以让所有接收者共享一条消息正文。具体数据库 设计方法和上面大同小异:

T_Message

1
2
3
4
5
6
Id              bigint       --消息ID
SenderId        bigint       --发送者ID
ReceiverId      bigint       --接收者ID
SendTime        datetime    --发送时间
ReadFlag        tinyint     --已读标志
MessageTextId   bigint       --这里把消息正文内容换成消息正文Id

T_MessageText

1
2
3
Id              bigint       --ID标识
SenderId        bigint       --发送者ID
MessageText     text        --消息正文

这样,我们就大大节省了消息的存储空间,但是查询的时候就稍微麻烦一点,就需要进行联合查询了,查询自己的未读消息可以这样(意思一下,可能还有更高效的查询方式):

1
2
3
SELECT T_Message.*,T_MessageText.* FROM T_Message
INNER JOIN T_MessageText ON T_Message.MessageTextId=T_MessageText.Id
WHERE T_Message.ReceiverId=myid AND T_Message.ReadFlag=0

用这种方法除了正文我们不能随便删除外,用户还是可以自己管理自己的消息。

 

3、百万级大用户量

如果一个网站到了百万级的用户量了,那我不得不膜拜该网站和网站经营者了,因为经营这样的网站一直是笔者的梦想:)好了,回归正题,如果这样的系统 放你面前,让你设计一个站内信群发数据库,你该何去何从,总之,上面两种常规的办法肯定是行不通了的,因为庞大的数据量会让消息表撑爆,即使你分区也无济 于事。这时候作为一个系统架构师的你,可能不仅仅要从技术的角度去考虑这个问题,更要从用户实际情况去着手寻找解决问题的办法。这里,有一个概念叫“活跃 用户”,即经常登录网站的用户,相对于那些一时冲动注册而接下来又从来不登录的用户来说,活跃用户对网站的忠诚度很高,从商业的角度来讲,忠诚的客户享受 更高端的服务。

根据这个思路,我们来探索一种方法。假设网站有500万注册用户,其中活跃用户为60万(这个比例真很不错了),现在我们要对所有用户群发一封致谢信。还是上面两张表,首先我们可以先往消息表中插入一条群发标识为-1 的 消息,这里我们用字段SourceMessageId(原始消息)来标识(-1为原始群发消息本身,其他则是原始消息id),这样其实群发的工作已经完成 了,用户可以看到这条公共的消息了。但是用户需要有消息的控制权,所以必须让每个用户拥有一条自己的消息。要达到这个目的,我们可以让用户登录时检查是否 已经拷贝原始消息,如果没有拷贝,则拷贝一份原始消息并插入消息表,群发标识为原始消息的id ;如果已经存在原始消息的拷贝,则什么都不做。这样,我们就只要为这60万活跃用户消耗消息空间就可以了。具体数据库设计如下:

T_Message

1
2
3
4
5
6
7
Id                  bigint       --消息ID
SenderId            bigint       --发送者ID
ReceiverId          bigint       --接收者ID,如果为原始群发消息则为-1
SendTime            datetime    --发送时间
ReadFlag            tinyint     --已读标志,如果为原始群发消息则统一为0未读
SourceMessageId     bigint       --如果为-1则为原始群发消息,其他则为原始消息id
MessageTextId       bigint       --这里把消息正文内容换成消息正文Id

T_MessageText 与上面方法的一样。

当然,如果你的活跃用户达到100%,那这种方法相对前一种就没有优势了,但这种情况基本上不太可能,所以,笔者觉得这种方法来处理大用户量的消息群发还是可行的。

 

4、总结

本文只是大致阐述了实现的原理,很多细节都忽略没有考虑,纯粹一个设计想法而已,有兴趣的朋友可以去自己实践一下,另外,笔者对数据库也不是很精通,如果有哪里阐述错误的还请指出,让我们一起进步。

 

5、如果你喜欢设计和架构,你可能还会喜欢以下文章

Facebook和人人网的网站后台架构对比

facebook图片存储架构技术全解析

各大网站架构总结笔记

一步步构建大型网站架构

大型网站架构不得不考虑的10个问题

 

本文为笔者原创,欢迎转载,但请在页面明显处表明原文链接,谢谢!
原文链接:http://www.itivy.com/ivy/archive/2011/6/3/sms-db-design-of-million-user.html

分享到:
评论

相关推荐

    站内信系统数据库设计.pdf

    站内信系统数据库设计是构建在线平台不可或缺的一部分,它允许用户和管理员在系统内部进行通信。与电子邮件不同,站内信完全在系统内部处理,通过数据库记录消息来实现。站内信系统通常包括两种基本功能:一是点对点...

    百万级数据在Excel和Sql数据库之间相互导入、导出

    在IT行业中,处理大量数据是常见的任务,尤其是在百万级数据量的情况下。Excel和SQL Server都是常用的工具,但它们各自在处理大数据方面的优缺点明显。本文将深入探讨如何在Excel和SQL Server之间有效地进行百万级...

    支付交易平台数据库设计文档

    标题“支付交易平台数据库设计文档”表明本文档详细介绍了构建银行支付交易平台时所需设计的数据库架构。数据库设计是信息技术领域中极为重要的一环,尤其是在金融行业,其准确性、完整性和安全性的要求尤为严格。本...

    教务管理系统 数据库设计

    ### 教务管理系统数据库设计详解 #### 一、引言 随着信息技术的发展,教育领域的信息化建设也变得日益重要。教务管理系统作为学校信息化建设的重要组成部分,对于提高学校的管理水平和服务质量具有重要意义。本篇...

    数据库设计大作业(完整版 )

    "数据库设计大作业(完整版)" 本资源为大连理工大学软件学院的数据库设计大作业,背景为某一农产品网上商城系统的数据库设计。该系统有居民、销售商两个身份,他们各自所具有的操作描述如下: 业务规则 1. 角色...

    网上购物商城数据库设计

    ### 网上购物商城数据库设计详解 #### 一、数据库设计概述 在构建一个功能完善的网上购物商城系统时,数据库的设计是整个项目的核心部分之一。合理的数据库设计不仅能够提高系统的运行效率,还能够保障数据的安全...

    8个数据库设计典型实例

    ### 数据库设计典型实例概述 本文将针对八个典型的数据库设计实例进行深入解析,涉及人力资源管理、销售、仓储等多个领域。每个实例都将从实际应用场景出发,详细介绍其设计思路、功能需求和技术实现。 ### 实例1...

    学生成绩管理系统-数据库设计

    学生成绩管理系统数据库设计 本系统的最终用户为管理员,旨在满足学校管理员对成绩管理的需求。系统的主要功能包括用户查询部分和管理员管理部分。在用户查询部分,管理员可以查询学生信息、成绩信息等。在管理员...

    数据库课程设计 图书管理系统

    图书管理系统是一个典型的数据库应用案例,它涉及到多个方面,包括数据模型设计、数据库表结构规划、查询优化以及用户界面设计等。在这个项目中,学生将有机会实践如何构建一个能够有效地管理和检索图书信息的系统。...

    数据库课程设计——教学管理系统(C#含源码)

    总的来说,这个“数据库课程设计——教学管理系统(C#含源码)”项目涵盖了数据库设计、C#编程、面向对象设计原则、数据访问技术以及用户体验等多个IT领域的关键知识点。通过研究和实践这个项目,学习者可以提升自己...

    C# Excel大量数据快速导入数据库源码

    本主题涉及的是如何使用C#高效地将Excel中的大量数据导入到数据库,这在数据分析、报表生成以及企业级应用中是非常常见的需求。源码提供了一种实现方式,可以在实际项目中直接应用。 首先,`Frm_ReadExcel.cs`可能...

    数据库的设计文档(设计说明书)

    数据库的设计文档,通常被称为设计说明书,是数据库开发过程中的关键组成部分。它详尽地记录了数据库的架构、逻辑关系以及物理实现方式,为数据库的创建、维护和优化提供了清晰的指导。以下是对这个主题的详细阐述:...

    图书销售管理系统数据库课程设计

    图书销售管理系统数据库课程设计是一项旨在实现书店自动化管理的实践项目,涵盖了用户管理、图书管理、图书销售管理、查询管理、报表查询以及数据管理等多个关键功能。以下是对这些功能的详细阐述: 1. 用户管理:...

    数据库课程设计-JAVA实现学生信息管理系统

    在本项目中,“数据库课程设计-JAVA实现学生信息管理系统”是一个用Java编程语言开发的教育实践项目,旨在帮助学习者理解和应用数据库管理系统的概念。这个系统主要目标是管理和操作学生的信息,提供一个用户友好的...

    数据库商品销售管理系统课程设计

    综上所述,数据库商品销售管理系统课程设计涵盖了数据库设计、数据操作、权限管理、用户交互、系统测试等多个IT领域的知识点,对于学习者来说,这是一个全面了解和掌握信息系统开发的宝贵实践机会。

    火车票预订系统数据库设计

    火车票预订系统数据库设计是构建在线票务服务的基础,它涉及到多个关键领域的技术知识,包括数据库理论、软件工程、Web开发以及用户交互等。在这个系统中,数据库是核心,负责存储和管理大量的火车票信息、乘客信息...

    医院管理系统 数据库课程设计(源码+课程设计)

    在这个数据库课程设计中,学生将有机会深入理解数据库在实际应用中的重要性和实现方式。 首先,我们要讨论的是数据库的设计。在医院管理系统中,数据库是核心组成部分,它存储了所有与医院运营相关的重要数据。设计...

    学生成绩管理系统+数据库课程设计 学生成绩管理系统+数据库课程设计

    学生成绩管理系统与数据库课程设计是一项综合性的任务,旨在让学生理解和掌握数据库系统在实际应用中的设计、实现和管理。在这个项目中,学生需要构建一个能够处理学生成绩数据的系统,同时利用数据库技术来存储、...

    数据库课程设计报告—公交车查询系统

    数据库课程设计报告——公交车查询系统,是一份详细阐述如何构建公交查询系统的技术文档,涵盖了数据库设计的核心要素。在这个项目中,学生陈泽聪通过实践,深入理解了数据库在实际应用中的重要性和实施步骤。这份...

    报刊订阅管理系统【SQLServer数据库+课程设计文档】

    报刊订阅管理系统【SQLServer数据库+课程设计文档】 1.需求分析 1.1系统需求分析 1.1.1系统调查 1.1.2用户需求 1.1.3 可行性分析 1.1.4系统业务流程图 1.2 系统逻辑方案 1.2.1 数据流图(简称DFD) 1.2.2数据...

Global site tag (gtag.js) - Google Analytics