一个简单的论坛系统,以数据库储存如下数据:
用户名,email,主页,电话,联系地址,发帖标题,发帖内容,回复标题,回复内容。
每天论坛访问量300万左右,更新帖子10万左右。
请给出数据库表结构设计,并结合范式简要说明设计思路。
这是我看见的百度面试题,以前也在cdsn上面看见过类似的问题,没有仔细想就写了自己的见解和答
案,很可惜我以前的想法是错误的;算是误人子弟阿,郁闷!因此我还是先把和几个朋友讨论的结果和自
己的想法做一个总结,算是弥补我以前想法造成别人曲解的过错;
首先,我们先来分析一下这道面试题:用户名,email,主页,电话,联系地址,发帖标题,发帖内
容,回复标题,回复内容。这些字段可以基本归为三类:
1、用户基本信息:用户名(UserName),email(Email),主页(HomePage),电话(Tel),联系地址
(Address);
2、发帖主题信息:发帖标题(Title),发帖内容(Content);
3、回复信息:回复标题(RTitle),回复内容(RContent);
以上一步有基本开发经验的人都知道,只是对基本的信息进行划分;相信将用户基本信息存放在一
张表内不会有什么好讨论的,我创建一张表叫T_Users,并建立主键UserID,用户基本信息所需要存放的
内容都放置在此表内;那么是应该把发帖主题和回复信息分别创建两张表存放数据呢还是应该存放在一张
表内?字段内容还是比较接近的,因此从数据冗余的角度看,一张表和两张表在此方面的区别并不影响设
计;假设按照大多数论坛的设计思路,将2、3设计成两个表T_Topics和T_Reverts后,再来分析看看是否
合适这里的要求;
现在“每天论坛访问量300万左右,更新帖子10万左右”对这句话进行分析,才是这个面试题的关键
所在。面试题显然要求在操作数据库的性能方面要有更高的要求。而对数据库的操作而言,检索数据的性
能基本不会对数据造成很大的影响(精确查找的情况下),而对表与表之间的连接却会产生巨大的影响,
特别在有巨量数据的表之间;而对数据库的连接也是相当消耗性能的操作(这在ADO.NET的教程中都多次
提醒的);因此对问题的定位基本可以确定:在显示和检索数据时,尽量减少数据库的连接以及表与表之
间的连接;
解决问题的指导性原则找到了,那就来看看,从上面的设计中,有哪一些地方会产生我们提到的表与
表之间的连接;(连接数据库的次数尽量减少到每打开一个页面只连接一次数据库就可以得到所有的数据
)1、用户基本信息中的用户名在发帖主题列表以及打开一个主题查看回复内容时上面会有所显示,需要
在T_Users和其他两张表进行连接;2、在打开一个主题查看回复内容时,需要在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这个字段来增加性能!
上面的面试题算是分析完了,但是从这道题目的分析中我们可以看出来,这样的设计是建立在“一个
简单的论坛系统”这样的基础上的极端事例,在我们真实的世界中,不太会有很多的人喜欢这样简单的论
坛,而且这样的论坛在扩展性方面会产生很大的限制;这算不算这道题目是应试教育的产物呢?而且在设
计的时候不仅仅是为了适应现在系统的需求还需要提供将来新的要求的变化,因此在实际的开发过程中间
并不推荐使用这道面试题的答案。
分享到:
相关推荐
建议电子表格,是数据结构课程设计中常用的题目之一。
数据结构设计的案例简易计算器。是本人数据结构的大作业的一个。纯C完成,简单好懂。值得借鉴的范例
利用数据结构中的栈的知识完成加减乘除乘方五种运算,可运用小括号
数据结构课程设计-----简易计算器 Visual Studio 2010
数据结构课程设计之简易计算器这个课题的全部内容都在了,让你轻松过掉这门课。yeah!
简易商品管理系统 数据结构课程设计数据结构课程设计数据结构课程设计数据结构课程设计
简易的通讯录,数据结构实验 基于双向链表,可以进行查询,添加,删除,修改,保存等操作
有该系统的源代码和课程设计的报告 该系统简单实现对客栈的住宿情况进行管理。包括以下信息: 客房:房号、房型、单价(每床...此简易客房管理系统采用动态分配数组空间的数据结构实现对以上信息进行基本的处理操作。
简易学生管理系统源码 数据结构 大作业 学籍管理 C++
学数据结构做的小设计 记事本 使用C语言编写的 难点是指针与链表 实现了对记事添加、删除与排序功能
这是我在学习了数据结构后,完成的一个课设
简易电子表格 : 可以对表格进行建立、数据输入、数据编辑、统计、计算及其他一些表格操作。 实现功能: 1.按表格形式显示表格,并支持用户使用简单的功能键 2.建立空白表格,同时在屏幕上显示,使其处于可输入数据...
运用了数据结构的各种结构(栈,链表,队列,无向网....)来解决简单的学生管理系统的增删改....
这是一些常用的数据结构的代码,用来给初学者学习之用。
简易计算器自己改编的,功能实现到多位整数和浮点数!
最简单的实现通讯录,供参考学习扩展,本人也是初学望交流
简易图书管理系统数据结构课程设计
简单实现一个文本编辑器,使用链表。插入、删除、读写文件
这是一个数据结构课程设计银行账户管理系统,其中用到的数据结构有哈希链 有文件读写功能 账户密码管理功能 用户界面简约有序,不足之处,大家多多包涵,指教,谢谢