一个论坛的需求如下 (精简):
需求:
设计一个论坛,要求实现如下主要功能:
<!--[if !supportLists]-->
1、 <!--[endif]-->要求实现版块管理,能够显示版块的名称,描述,版主,该版最后发帖时间与发帖人及发帖主题。一般来说论坛的版块都比较多,用户还需求对这些版块进行分类管理(如灌水类,版主管理,编程学习类等)。
<!--[if !supportLists]-->
2、 <!--[endif]-->要求实现论坛的管理,能够显示该论坛中的文章列表,在列表中的每篇文章要求显示其主题,发帖时间,浏览次数,最后回复时间,最后回复人。
<!--[if !supportLists]-->
3、 <!--[endif]-->要求能够为论坛指定版主。
<!--[if !supportLists]-->
4、 <!--[endif]-->要求实现只有注册用户才能访问论坛,并且要求限制每个用户只能访问特定的论坛。用户比较多,一般来说要求能够一次性对多个用户进行访问权限管理(类似于Windows中的用户组)。
<!--[if !supportLists]-->
5、 <!--[endif]-->要求对论坛中的操作(删除,编辑,修改,回复)实现不同的用户不同的权限。
<!--[if !supportLists]-->
6、 <!--[endif]-->要求对于用户访问论坛进行日志(登录,注销,发帖,删帖,编辑帖等等)记录。
<!--[if !supportLists]-->
7、 <!--[endif]-->要求实现论坛用户好友管理。
<!--[if !supportLists]-->
8、 <!--[endif]-->要求实现论坛用户的处罚管理(禁用IP,禁用用户ID,禁止发帖等)
<!--[if !supportLists]-->
9、 <!--[endif]-->对于用户发帖,回复进行积分管理。
当我们看到需求的时候,该如何用面向对象的思想把它转化为数据库应用呢?
以第一条需求实现为例子.第一句中出现了多个名词.版块,描述,版主,发贴时间,发贴人,发贴主题,论坛.看到这些名词我们会不会灵光一闪呢???这些名词之间有很明显的层次关系.论坛包括版块,一个论坛有多个版块,一个版块有其对应的名称,描述.那么一个版块是不是一个类呢?而名称和描述就是这个类的属性.你也许会说,那一个版块还有斑竹呢...斑竹是属于一个用户,不应该作为版块类的一个属性,应该有个用户类去实现用户的存储.这样,我们就抽象出一个Forum类...画出其ER图:
然后可以生成物理模型,就可以创建我们需要的数据库表了...
这里要引入一个数据库设计的知识点
:垂直分区
我们需要有个用户类来存储用户信息.进行ER建模.
同是用来存储用户信息,为什么要分开成两个表呢???这是因为这两张表中的字段代表的信息使用频率不同,所以我们拆成两个表,然后把这两个表形成一对一的关系.这就是垂直分区了.
这样我们根据需求抽象出多个类,然后确定他们之间的关系,ER图如下:
其中关于角色,权限的ER建模,其思想都是先分析出用户和角色是多对多关系,而角色和权限也是多对多关系,然后就是走套路了,取两个表的主键作为第三个表的联合主键.这里我们之所以引进角色这个类,是为了方便实现权限,否则的话,就太麻烦了.
这只是实现了一小部分需求的ER建模,对于没有分析的需求,思路都是一样的,找名词,分层次,上下文关系,建模.......