一道Baidu在线试题:论坛数据库设计

一个简单的论坛系统,以数据库储存以下数据: 
用户名,email,主页,电话,联系地址,发帖标题,发帖内容,回复标题,回复内容。 
天天论坛访问量300万左右,更新帖子10万左右。 
请给出数据库表结构设计,并结合范式简要说明设计思路。
面试

    这是我看见的百度面试题,之前也在cdsn上面看见过相似的问题,没有仔细想就写了本身的看法和答案,很惋惜我之前的想法是错误的;算是误人子弟阿,郁闷!所以我仍是先把和几个朋友讨论的结果和本身的想法作一个总结,算是弥补我之前想法形成别人曲解的过错;
    首先,咱们先来分析一下这道面试题:用户名,email,主页,电话,联系地址,发帖标题,发帖内容,回复标题,回复内容。这些字段能够基本归为三类:
    一、用户基本信息:用户名(UserName),email(Email),主页(HomePage),电话(Tel),联系地址(Address);
    二、发帖主题信息:发帖标题(Title),发帖内容(Content);
    三、回复信息:回复标题(RTitle),回复内容(RContent);
     以上一步有基本开发经验的人都知道,只是对基本的信息进行划分;相信将用户基本信息存放在一张表内不会有什么好讨论的,我建立一张表叫T_Users,并创建主键UserID,用户基本信息所须要存放的内容都放置在此表内;那么是应该把发帖主题和回复信息分别建立两张表存放数据呢仍是应该存放在一张表内?字段内容仍是比较接近的,所以从数据冗余的角度看,一张表和两张表在此方面的区别并不影响设计;假设按照大多数论坛的设计思路,将二、3设计成两个表T_Topics和T_Reverts后,再来分析看看是否合适这里的要求;
    如今“天天论坛访问量300万左右,更新帖子10万左右”对这句话进行分析,才是这个面试题的关键所在。面试题显然要求在操做数据库的性能方面要有更高的要求。而对数据库的操做而言,检索数据的性能基本不会对数据形成很大的影响(精确查找的状况下),而对表与表之间的链接却会产生巨大的影响,特别在有巨量数据的表之间;而对数据库的链接也是至关消耗性能的操做(这在ADO.NET的教程中都屡次提醒的);所以对问题的定位基本能够肯定:在显示和检索数据时,尽可能减小数据库的链接以及表与表之间的链接;
    解决问题的指导性原则找到了,那就来看看,从上面的设计中,有哪一些地方会产生咱们提到的表与表之间的链接;(链接数据库的次数尽可能减小到每打开一个页面只链接一次数据库就能够获得全部的数据)一、用户基本信息中的用户名在发帖主题列表以及打开一个主题查看回复内容时上面会有所显示,须要在T_Users和其余两张表进行链接;二、在打开一个主题查看回复内容时,须要在T_Topics和T_Reverts之间进行链接;其余应该是不须要产生表与表之间的链接;按照面试题来推测:T_Users的数据量应该在1万-10万之间,T_Topics应该在100-1000万之间,T_Reverts应该在1000万-1亿之间;从上面两类链接能够看出来,T_Users和T_Topics会在列表页面链接一次;T_Users、T_Topics和T_Reverts三张表会链接一次;我说不上来第一种链接是否能够容许(至少在我开发的系统里面都是容许的),可是另外三张表链接是绝对不会容许的!特别是T_Topics和T_Reverts两表之间的链接会产生很大的性能损耗,所以须要避免这样的状况产生。
    那怎么样的设计能够避免T_Topics和T_Reverts两表之间的链接呢?前面已经进行了分析:能够考虑把发帖主题和回复信息存放在一张表(T_Infos)里面,看看是否能够解决这个问题;咱们设计一个字段(Flag)来标记是主题仍是回复的内容;设计一个字段(ParentID,主题此字段为ID值)来指定是哪个特定主题的回复;在开打回复信息时,只须要按照所知道的主题ID,就能够检索到这个主题的内容以及全部的回复内容,上面指出的问题就能够解决!
    为了性能,咱们再一次对T_Users和T_Infos链接对性能的影响进行一下细致的分析,能够经过在T_Infos表内增长UserName字段来解决和它的链接,这样至少在显示时,性能可以获得保证;可是这样的设计由于UserName字段是冗余的,所以在用户修改UserName的时候就会产生同步数据的问题,这个须要程序来进行弥补,并是咱们认为用户不会常常性的修改他的用户名这样的前提下;
    所以这道面试题的答案应该是设计两张表,用户基本信息表T_Users和内容表T_Infos,这两张表的链接仍是经过UserID,可是T_Infos中增长UserName这个字段来增长性能!
    上面的面试题算是分析完了,可是从这道题目的分析中咱们能够看出来,这样的设计是创建在“一个简单的论坛系统”这样的基础上的极端事例,在咱们真实的世界中,不太会有不少的人喜欢这样简单的论坛,并且这样的论坛在扩展性方面会产生很大的限制;这算不算这道题目是应试教育的产物呢?并且在设计的时候不只仅是为了适应如今系统的需求还须要提供未来新的要求的变化,所以在实际的开发过程当中间并不推荐使用这道面试题的答案。 数据库

相关文章
相关标签/搜索