如果要更改课程信息,则要更改许多条记录
使用第二范式修改数据库脚本:
学生应该是一个实体表的信息
CREATE TABLE student
(
stuno VARCHAR2(50) PRIMARY KEY,
stuname VARCHAR2(50),
stuage NUMBER(2)
);
课程也应该是一个实体表
CREATE TABLE course
(
cid NUMBER(2) PRIMARY KEY,
cname VARCHAR2(20),
credit NUMBER(2)
);
学生选课:一个学生可能选多个课程,一门课也会有多个学生参加,课程也应是一个实体表
CREATE TABLE selectcourse
(
stuno VARCHAR2(50),
cid NUMBER(2),
grade NUMBER(2),
加入外键关联,因为学生或者课程,缺一个,成绩都没有了
);
INSERT INTO student VALUES('s001','张三',20);
INSERT INTO student VALUES('s001','李四',20);
INSERT INTO student VALUES('s001','王五',20);
INSERT INTO course VALUES('ca','JAVA',3);
INSERT INTO course VALUES('cb','ORACLE',5);
INSERT INTO selectcourse VALUES('s001','ca',89.0);
INSERT INTO selectcourse VALUES('s002','ca',79.0);
INSERT INTO selectcourse VALUES('s003','ca',77.0);
以上设计解决了以下问题:
学生不选课,课程信息不会消失
更新课程的时候直接更新课程表即可
所有的关联关系在关系表中提现
也就是现在完成了多-多的关系。
3)第三范式
在实际开发中使用的频率最多。
定义:在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖,则符合第三范式。因此,满足第三范式的数据库表应该不存在如下的依赖关系:
关键字段——》非关键字段a——》非关键字段b
例如现在要求设计一个学生表,包含学号、姓名、年龄、所在院校、学院地址、学院电话,此时肯定不能第一范式,但是如果使用第二范式呢?
CREATE TABLE student
(
stuno VARCHAR2(50) PRIMARY KEY,
stuname VARCHAR2(50),
stuage NUMBER(2)
);
CREATE TABLE collage
(
cid VARCHAR2(50) PRIMARY KEY,
cname VARCHAR2(50),
caddress VARCHAR2(50),
ctel VARCHAR2(50)
);
CREATE TABLE studentcollage
(
stuno VARCHAR2(50),
cid VARCHAR2(50),
设置主外键关系
);
按照这种设计,一个学生可以在多个学院同时上课。此时最好的做法,一个学院包含多个学生,一个学生属于一个学院。实际上,此设计就类似于部门和雇员表的设计结构。
CREATE TABLE collage
(
cid VARCHAR2(50) PRIMARY KEY,
cname VARCHAR2(50),
caddress VARCHAR2(50),
ctel VARCHAR2(50)
);
CREATE TABLE student
(
stuno VARCHAR2(50) PRIMARY KEY,
stuname VARCHAR2(50),
stuage NUMBER(2),
cid VARCHAR2(50),
建立主外键关联
);
这就是一个很明确的一对多关系设计。
以上三个范式只能参考,如果真的按照这样方式设计,则很累。数据库唯一原则:
数据库表的关连查询越少越好,SQL复杂度越低越好。
2.数据库设计工具(重点)
常用的是Sybase的PowerDesigner开发工具
点击新建——》物理数据模型Physical Data Model——》选择类型ORACLE VERSION 10g
下面使用PowerDesigner工具将Oracle中的dept和emp表进行还原
Name是表在工具中的显示,而Code是该表在数据库中真正的名字。然后定义列
这两张表存在关系,所以为了维护主外键关系,可以直接在工具中进行拖拽操作。
双击打开
该键名称太长,改短一些:
得到关系之后就可以通过工具进行数据库脚本的创建。
在桌面生成数据库脚本:
可以看到桌面的脚本:
下面生成数据库的测试数据:
放在桌面:
3.数据库设计实例(重点)
1)要求
设计一个网上购物程序(使用powerdesigner建立模型并编写测试数据)。有一下需求: