一道百度面试题试答(数据库表设计),欢迎大家拍砖!

feichexia 2011-04-30 07:30:04
加精
题目:一个简单的论坛系统,以数据库储存如下数据:

用户名,email,主页,电话,联系地址,发帖标题,发帖内容,回复标题,回复内容。

每天论坛访问量300万左右,更新帖子10万左右。

请给出数据库表结构设计,并结合范式简要说明设计思路。

下面是我的试答,大家尽管拍砖啊!
试答:
首先经常变动的数据不能和相对稳定的数据放在同一张表。本题中用户名、emial、主页、电话、联系地址属于相对稳定数据(用户不会没事天天登录论坛改email、电话吧?)。其他关于发帖和回帖的数据都属于经常变动的数据。
另外每天帖子更新10万左右,访问量却有300万左右,可以看出很多人“只看帖(或者回帖)但很少发帖”。但是用户看了某个帖子他不一定要回帖,然而隐含一个需求:必须记录每一个发帖的访问量(我觉得没必要记录该发帖具体有哪些用户访问过)。
所以我大概是这样设计表结构的:(4张表)

用户信息表: user
字段名 数据类型 是否允许为空 键属性
uid INT N 主键
uname VARCHAR N
homepageVARCHAR Y
phone VARCHAR Y
address VARCHAR Y

发帖信息表:post
字段名 数据类型 是否允许为空 键属性
pid INT N 主键
title VARCHAR N
content VARCHAR N
uid(发帖者ID)INT N 外键

发帖访问情况表:visit
字段名 数据类型 是否允许为空 键属性
vid INT N 主键
pid INT N 外键
num(浏览数量)INT N

回帖信息表:reply
字段名 数据类型 是否允许为空 键属性
rid INT N 主键
title VARCHAR N
content VARCHAR N
uid INT N 外键
pid INT N 外键

数据库第一范式就不用说了,实体中的某个属性不能有多个值或者不能有重复的属性。这个很容易满足。
再看第二范式,属性必须完全依赖主键。所以发帖和回帖应该设计为在不同的表,因为回帖内容和发帖内容显然依赖于完全不同的主键,其他的类似。即第二范式在这里影响了分几张表。
第三范式是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。按我的理解是,每张表应该尽可能的“干净”,即用户信息表就存与用户最相关的信息,而不能把帖子信息信息也存到里面去。
回帖和发帖信息表中都有一个外键uid来标识回帖或发帖的作者,这就足够了,你不必再把uname也存到里面去,因为uname可以根据uid从user表中查到。当然有时为了性能需要,可能违背数据库设计三范式,比如违背第三范式的字段冗余约束。

有一个地方我觉得肯定另有玄机,“每天帖子更新10万左右,访问量却有300万左右”,这个比例是1:30,具体什么也说不清楚,还望大家多多讨论,指点迷津



...全文
9097 147 打赏 收藏 转发到动态 举报
写回复
用AI写文章
147 条回复
切换为时间正序
请发表友善的回复…
发表回复
pennylord 2011-05-10
  • 打赏
  • 举报
回复
刚刚学数据库。可是离散有点难过啊。。一起努力
lkang08 2011-05-07
  • 打赏
  • 举报
回复
不错,感谢分享
feichexia 2011-05-07
  • 打赏
  • 举报
回复
[Quote=引用 142 楼 xjsfuture_hotmail 的回复:]

有想法, 有实践, 这一点比我强啊, 真要多学习了, 顶楼主
[/Quote]
呵呵,重在有自己的想法(即使是错的,因为想法可以不断进化的)还有实践。这是我通过一次次惨痛的教训后的切身体会。
xjsfuture_hotmail 2011-05-07
  • 打赏
  • 举报
回复
有想法, 有实践, 这一点比我强啊, 真要多学习了, 顶楼主
呼啦圈521 2011-05-06
  • 打赏
  • 举报
回复
有点看不懂
x_q123456 2011-05-06
  • 打赏
  • 举报
回复
good
xijielaolin 2011-05-06
  • 打赏
  • 举报
回复
要学的 太多了
for1answer 2011-05-06
  • 打赏
  • 举报
回复
必须再学学
红拂故人 2011-05-06
  • 打赏
  • 举报
回复
都糊涂了!!!!!!汗--
yxsalj 2011-05-06
  • 打赏
  • 举报
回复
按范式思路做设计,死路一条;原则上是分区,读写分离,用空间换性能
wenhaoshanbu 2011-05-06
  • 打赏
  • 举报
回复
好难啊
windows7 2011-05-06
  • 打赏
  • 举报
回复
看不懂,真难啊
feichexia 2011-05-06
  • 打赏
  • 举报
回复
大家不要回复了,本话题已经结贴了,谢谢配合啊~
程序猿6699 2011-05-06
  • 打赏
  • 举报
回复
感觉越搞越复杂了呢
feichexia 2011-05-05
  • 打赏
  • 举报
回复
怎么回事啊,我结贴了啊,怎么还可以回复啊?
luckyleopard 2011-05-05
  • 打赏
  • 举报
回复
[Quote=引用 61 楼 zhang6464 的回复:]
引用 40 楼 shiqing23 的回复:

只需要三个表


用户信息表: user
字段名 数据类型 是否允许为空 键属性
uid INT N 主键
uname VARCHAR N
homepageVARCHAR Y
phone VARCHAR Y
address VARCHAR Y

发帖信息表:post
字段名 数据类型 是否允许为空 键属性
uid(发帖者……
[/Quote]

post表如果设计成
回帖信息表:reply
字段名 数据类型 是否允许为空 键属性
pid INT N 主键 & 外键
content VARCHAR N


那么说明回帖全部是匿名回复
本人觉得,应该设计成

字段名 数据类型 是否允许为空 键属性
rid int N 主键
uid INT Y 外键
pid int N 外键
content VARCHAR N
isAnonymous BIT N

这样的话用户可以回复多条,并且如果是一个已经登陆用户,那么他选择是否匿名回复(通过isAnonymous进行判断),如果是游客,那么当然是匿名回复,此时其uid可以设置为0。
ring2004 2011-05-05
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分
zy20072713 2011-05-05
  • 打赏
  • 举报
回复
看到那么一大片就头疼啊……
zhujiang2 2011-05-05
  • 打赏
  • 举报
回复
汗,很多时候为了性能的提升,不遵守范式也是没办法的,冗余换性能
feichexia 2011-05-05
  • 打赏
  • 举报
回复
结贴了,都盖到100多层了
加载更多回复(88)

6,108

社区成员

发帖
与我相关
我的任务
社区描述
其他数据库开发 数据库报表
社区管理员
  • 数据库报表社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧