自己动手写BBS作为自己学习了一个多月的jsp基础的一个练习吧。算是一个比较完整的Jsp网站了。

本文介绍这个简单BBS的数据库设计部分。

考虑到一个最简单的BBS系统需要的几个实体分别是版块、主题(帖子)、主题回复和用户。

主要逻辑关系是

1.帖子属于版块中

2.回复属于一个帖子

3.用户发布帖子和回复

4.用户对版块,帖子和回复进行管理(按权限) 

5.用户对用户进行管理(按权限)

 

因此设计基本的数据库E-R图如下

 

 

最后确定表数量

用户表user

帖子表post

回帖表sub_post

版块表block

帖子回复关系表

版块帖子关系表

版块用户关系表

 

修改

在实际设计中修改了表post 添加了属性 last_mod_time 表示此帖子最后修改的时间,从而确定帖子按修改时间从近到久的排列顺序。

也可以使用查询最后一条回帖记录的回帖时间来确定排序,但考虑到查询比较复杂耗时,性价比不高,故采用添加一个属性的方法。

 

讨论

关于数据库设计的一些讨论:

  数据库设计是否一定要满足数据库范式才是最好的呢?

  我发现,当数据库实体间的关系为1:1或者1:N时,不让一定满足了三范式的数据库设计方案才是最好的。相反这种设计还可能产生冗余数据。

例如本系统中的数据库

帖子表(帖子id,帖子信息)

回帖表(回帖id,回帖信息)

帖子回帖关系表(帖子id,回帖id)

 

帖子和回帖是1:N的关系,此时,如果我们将回帖表改成(回帖id,回帖信息,帖子id),我们可以认为回帖信息和对回帖id存在部分函数依赖,即这样的设计是不满足2NF的。也就是说我们将本应该分开的两个关系(回帖、帖子回帖)合并到了一起,但是正是这种合并减少了一部分冗余,并且不会导致删除、插入异常。同时简化了查询。

因此当数据库中存在这种1:N或1:1关系时可以考虑这样的设计方式。虽然不一定满足数据库设计范式,但是却是一个更合理的设计方法