`

简易论坛,数据结构

 
阅读更多

一个简单的论坛系统,以数据库储存如下数据:
用户名,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语言实现的计算器程序,它展示了数据结构在实际问题中的应用。数据结构是计算机科学中一个核心的概念,它研究如何组织和存储数据,以便高效地访问和操作这些数据。在...

    简易记事本 数据结构(C语言)

    本项目"简易记事本 数据结构(C语言)"是学习数据结构时的一个实践设计,它用C语言实现了一个简单的记事本程序,主要涵盖了指针和链表的数据结构知识点。 首先,C语言是一种底层编程语言,它的特点是直接对内存进行...

    数据结构课程设计之简易计算器

    本课题“数据结构课程设计之简易计算器”旨在通过构建一个简单的计算器来加深对数据结构的理解。下面将详细介绍该设计中的核心知识点。 1. **数据结构基础**:计算器设计涉及的主要数据结构包括栈和队列。栈用于...

    数据结构课程设计-----简易计算器

    在这个项目中,我们关注的是“简易计算器”的实现,这是一个常见的课程设计任务,旨在结合数据结构的知识来解决实际问题。这个简易计算器的开发通常会涉及解析、计算表达式以及错误处理等核心功能。 首先,我们要...

    数据结构课设简易城市交通咨询系统

    在这个“数据结构课设简易城市交通咨询系统”中,我们可以推测作者利用所学的数据结构知识设计了一个能够为用户提供城市交通信息的系统。这个系统可能涉及了多种数据结构的应用,如数组、链表、栈、队列、树、图等,...

    数据结构(简易实现学生管理系统)

    在这个“简易实现学生管理系统”的项目中,我们利用了多种数据结构来构建一个功能齐全的学生信息管理系统。下面我们将详细探讨这些数据结构及其在系统中的应用。 首先,栈是一种具有“后进先出”(LIFO)特性的数据...

    数据结构简易计算器

    "数据结构简易计算器"是一个这样的项目,它展示了如何利用编程语言处理数学运算,并且支持多位整数和浮点数的计算。这个项目对于理解基本的算法、数据结构以及程序设计逻辑具有很大的帮助。 首先,我们需要理解...

    一个简易通讯录 数据结构实验

    在本实验中,我们关注的是一个简易通讯录的实现,这是一个数据结构的实践项目。通讯录通常用于存储联系人的个人信息,如姓名、电话号码、地址等。在这个实验中,我们利用了双向链表这一数据结构来实现通讯录的核心...

    简易商品管理系统 数据结构课程设计

    在本项目中,"简易商品管理系统 数据结构课程设计"是一个典型的IT实践项目,它结合了计算机科学中的核心概念——数据结构,以及实际应用中的商品管理功能。数据结构是计算机科学中处理和组织大量数据的一种方式,它...

    数据结构(简单的实现代码)

    数据结构是计算机科学中的核心概念,它涉及到如何在计算机中有效地组织和管理数据,以便进行高效的操作。在本资料包中,“数据结构(简单的实现代码)”提供了对常见数据结构的简单实现,这对于初学者来说是非常宝贵...

    简易学生管理系统源码 数据结构 大作业 学籍管理 C++

    总的来说,这个简易学生管理系统项目结合了C++编程、数据结构和学籍管理的知识点,对于学习和巩固这些基础概念提供了实践经验。通过分析和实现这样的系统,学生可以提升自己的编程技能,加深对数据结构应用的理解,...

    数据结构课程设计————简易文本编辑器

    简易文本编辑器的总体目标:在Visual Studio的开发环境下,利用所学C语言和数据结构的相关知识,开发一个具有良好人机界面的简易文本编辑器,实现对文本的简单修改,从而达到编辑文本以及查看文本信息的目的。...

    数据结构课程设计(简易客房服务系统)

    有该系统的源代码和课程设计的报告 该系统简单实现对客栈的住宿情况进行管理。包括以下信息: 客房:房号、房型、单价(每床...此简易客房管理系统采用动态分配数组空间的数据结构实现对以上信息进行基本的处理操作。

    约瑟夫数据结构C语言简易实现

    在IT领域,尤其是在数据结构与算法的学习和应用中,“约瑟夫数据结构C语言简易实现”这一主题涉及到了几个核心的知识点,包括约瑟夫问题、循环链表以及C语言编程基础。以下是对这些知识点的详细阐述: ### 约瑟夫...

    数据结构大作业 简易电子表格

    简易电子表格 : 可以对表格进行建立、数据输入、数据编辑、统计、计算及其他一些表格操作。 实现功能: 1.按表格形式显示表格,并支持用户使用简单的功能键 2.建立空白表格,同时在屏幕上显示,使其处于可输入数据...

    校园导航,数据结构大作业,通过验收,下载即可运行,包含自己制作的简易地图

    校园导航,数据结构大作业,通过验收,下载即可运行,包含自己制作的简易地图校园导航,数据结构大作业,通过验收,下载即可运行,包含自己制作的简易地图校园导航,数据结构大作业,通过验收,下载即可运行,包含...

Global site tag (gtag.js) - Google Analytics