设计范式(范式,数据库设计范式,数据库的设计范式)是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。关系数据库中的关系必须满足一定的要求,即满足不同的范式。目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、第四范式(4NF)、第五范式(5NF)和第六范式(6NF)。满足最低要求的范式是第一范式(1NF)。在第一范式的基础上进一步满足更多要求的称为第二范式(2NF),其余范式以次类推。一般说来,数据库只需满足第三范式(3NF)就行了。下面我们举例介绍第一范式(1NF)、第二范式(2NF)和第三范式(3NF).
在创建一个数据库的过程中,范化是将其转化为一些表的过程,这种方法可以使从数据库得到的结果更加明确。这样可能使数据库产生重复数据,从而导致创建多余的表。范化是在识别数据库中的数据元素、关系,以及定义所需的表和各表中的项目这些初始工作之后的一个细化的过程。下面是范化的一个例子
Customer |
Item |
price |
Thomas |
Shirt |
$40 |
Maria |
Tennis shoes |
$35 |
如果上面这个表用于保存物品的价格,而你想要删除其中的一个顾客,这时你就必须同时删除一个价格。范化就是要解决这个问题,你可以将这个表化为两个表,一个用于存储每个顾客和他所买物品的信息,另一个用于存储每件产品和其价格的信息,这样对其中一个表做添加或删除操作就不会影响另一个表。
假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合关键字(学号, 课程名称),因为存在如下决定关系:
(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)
这个数据库表不满足第二范式,因为存在如下决定关系:
(课程名称) → (学分) (学号) → (姓名, 年龄)
即存在组合关键字中的字段决定非关键字的情况。把选课关系表SelectCourse改为如下三个表: 学生:Student(学号, 姓名, 年龄);课程:Course(课程名称, 学分);选课关系:SelectCourse(学号, 课程名称, 成绩). 这样的数据库表是符合第二范式的。
假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。这个数据库表中存在如下决定关系: (仓库ID, 存储物品ID) →(管理员ID, 数量)
(管理员ID, 存储物品ID) → (仓库ID, 数量)本文转自:http://ce.sysu.edu.cn/cdbm/news/coures/200908/news_20090807210925_242.html
根据数据库概念设计,可以创建与实体对应的数据表。本系统中所包含的数据表的结构图如图4.6所示。本系统共包含5个数据表,下面分别介绍这些表的结构。
1.tb_bbs(根贴信息表)
根贴信息表用来保存发布的全部根贴信息,该表的结构如表4.1所示。
表4.1 tb_bbs 表的结构
字段名 |
数据类型 |
是否为空 |
是否主键 |
默认值 |
描述 |
bbs_id |
int(4) |
No |
Yes |
|
帖子ID(自动编号) |
bbs_boardID |
int(2) |
Yes |
|
((-1)) |
帖子所属版面的ID |
bbs_title |
varchar(70) |
Yes |
|
NULL |
帖子标题 |
bbs_content |
varchar(2000) |
Yes |
|
NULL |
帖子内容 |
bbs_sender |
varchar(20) |
Yes |
|
NULL |
帖子的发布者 |
bbs_sendTime |
datetime(8) |
Yes |
|
NULL |
帖子的发布时间 |
bbs_face |
varchar(8) |
Yes |
|
NULL |
帖子表情 |
bbs_opTime |
datetime(8) |
Yes |
|
NULL |
对帖子进行操作的时间 |
bbs_isTop |
varchar(1) |
Yes |
|
(0) |
是否为置顶帖子 |
bbs_toTopTime |
datetime |
Yes |
|
NULL |
帖子被置顶的时间 |
bbs_isGood |
varchar(1) |
Yes |
|
(0) |
是否为精华帖子 |
bbs_toGoodTime |
datetime(8) |
Yes |
|
NULL |
帖子被置精华帖子时间 |
2.tb_board(版面信息表)
版面信息表用来保存论坛中的版面信息,该表的结构如表4.2所示。
表4.2 tb_board 表的结构
字段名 |
数据类型 |
是否为空 |
是否主键 |
默认值 |
描述 |
board_id |
smallint(2) |
Yes |
Yes |
|
版面ID(自动编号) |
board_classID |
smallint(2) |
Yes |
|
NULL |
版面所属类别的ID值 |
board_name |
varchar(40) |
Yes |
|
NULL |
版面名称 |
board_master |
varchar(20) |
Yes |
|
NULL |
版面版主 |
board_pcard |
varchar(200) |
Yes |
|
NULL |
版面公告 |
3.tb_bbsAnswer(回复贴子信息表)
回复帖子信息表用来保存回复帖子的信息,该表的结构如表4.3所示。
表4.3 tb_bbsAnswer 表的结构
字段名 |
数据类型 |
是否为空 |
是否主键 |
默认值 |
描述 |
bbsAnswer_id |
int(4) |
No |
Yes |
|
ID(自动编号) |
bbsAnswer_rootID |
int(4) |
Yes |
|
NULL |
回复帖子根帖ID值 |
bbsAnswer_title |
varchar(70) |
Yes |
|
NULL |
回复帖子的标题 |
bbsAnswer_content |
varchar(2000) |
Yes |
|
NULL |
回复帖子的内容 |
bbsAnswer_sender |
varchar(20) |
Yes |
|
NULL |
回复帖子的回复者 |
bbsAnswer_sendTime |
datetime(8) |
Yes |
|
NULL |
回复帖子的时间 |
bbsAnswer_face |
varchar(10) |
Yes |
|
NULL |
回复帖子的表情 |
4.tb_class(论坛类别信息表)
论坛类别信息表用来保存论坛类别信息,该表的结构如表4.4所示。
表4.4 tb_class 表的结构
字段名 |
数据类型 |
是否为空 |
是否主键 |
默认值 |
描述 |
class_id |
smallint(2) |
No |
Yes |
|
ID(自动编号) |
class_name |
varchar(40) |
Yes |
|
NULL |
论坛类别名称 |
class_intro |
varchar(200) |
Yes |
|
NULL |
论坛类别介绍信息 |
5.tb_user(用户信息表)
用户信息表用来保存用户的信息,该表的结构如表4.5所示。
表4.5 tb_user 表的结构
字段名 |
数据类型 |
是否为空 |
是否主键 |
默认值 |
描述 |
id |
smallint(2) |
No |
Yes |
|
用户ID(自动编号) |
user_name |
varchar(20) |
Yes |
|
NULL |
用户名称 |
user_password |
varchar(20) |
Yes |
|
NULL |
用户密码 |
user_face |
varchar(11) |
Yes |
|
NULL |
用户表情 |
user_sex |
varchar(2) |
Yes |
|
NULL |
用户性别 |
user_phone |
varchar(12) |
Yes |
|
NULL |
用户电话 |
user_OICQ |
varchar(14) |
Yes |
|
NULL |
用户OICQ |
user_email |
varchar(100) |
Yes |
|
NULL |
用户的邮箱 |
user_from |
varchar(200) |
Yes |
|
NULL |
用户的来源 |
user_able |
varchar(1) |
Yes |
|
NULL |
用户能力 |
创建数据表后,还可以创建相关的数据表之间的关系,该关系实际上也反应了系统中各个实体之间的关系。设置了该关系后,
当改变tb_user数据表的user_name字段时,tb_bbs数据表的bbs_sender字段也会级联更新或删除;
当改变tb_board数据表的board_id字段时,tb_bbs数据表的bbs_boardID字段也会级联更新或删除;
当改变tb_class数据表的class_id字段时,tb_board数据表的board_classID字段也会级联更新或删除。数据表之间的关系图如图4.7所示。
这里注意PK、FK、I1、U1的意义:外键上建立索引大大节省了时间
PK主键=unique约束+not null约束 unique约束=unique索引 所以主键是有索引的
FK外键要参照主键或者是unique约束的列,所以foreign key的被参照列上也是有索引的。
注意:
1.表里面只能有一个主键约束,但可以有多个唯一约束.
2. 想要说明该字段唯一性却又允许重复就用唯一约束. tb_user数据表的user_name字段就是unique约束。因为姓名字段可能会重复,而主键约束是不允许有重复字段出现的,所以应该以学号设为主键. 主键和唯一索引的最大区别就是主键不可以为空,唯一索引可以为空
本文参考:http://wenku.baidu.com/link?url=TwJsDBvuTfDCT7ThBHJIfbcmy69xumtqu5ofH7F-jZ7FuR46SzdUpb8GeLUX_LYo9SW0Ud317qzWKzCM4xCERfE4GR0m9V9uSymxKWrSLM7