Oracle笔记(十六) 数据库设计范式
数据库设计范式是一个很重要的概念,但是这个重要程度只适合于参考。使用数据库设计范式,可以让数据表更好的进行数据的保存,因为再合理的设计,如果数据量一大也肯定会存在性能上的问题。所以在开发之中,唯一可以称为设计的宝典 —— 设计的时候尽量避免日后的程序出现多表关联查询。
一、第一范式
所谓的第一范式指的就是数据表中的数据列不可再分。
例如,现在有如下一张数据表:
CREATE TABLE member ( mid NUMBER PRIMARY KEY, name VARCHAR2(200) NOT NULL, contact VARCHAR2(200) );
这个时候设计的就不合理,因为联系方式由多种数据所组成:电话、地址、email、手机,邮政编码,所以这种设计是不符合的,现在可以修改设计:
CREATE TABLE member ( mid NUMBER PRIMARY KEY, name VARCHAR2(200) NOT NULL, address VARCHAR2(200), zipcode VARCHAR2(6), mobile VARCHAR2(20), tel VARCHAR2(20) );
但是在这里面有两点需要说明:
- 第一点,关于姓名,在国外的表设计中,姓名也分为姓和名两类,但是在中国就是姓名保存;
- 第二点,关于生日,生日有专门的数据类型(DATE),所以不能将其设置为生日年,生日月,生日日;
所谓不可分割指的是所有的数据类型都使用数据库提供好的各个数据类型。
二、第二范式:多对多
第二范式:数据表中的非关键字段存在对任一候选关键字段的部分函数依赖;
第二范式分为两种方式理解:
- 理解一:列之间不应该存在函数关系,现在有如下一个设计:
CREATE TABLE orders ( oid NUMBER PRIMARY KEY, amount NUMBER, price NUMBER, allprice NUMBER );
现在的商品总价(allprice)=商品单价(price)*商品数量(amount),所以存在了函数的依赖关系;
- 理解二:通过一个数据表的设计体现一下,完成一个学生选课系统,如果说现在按照第一范式,则如下:
CREATE TABLE studentcourse ( stuid NUMBER PRIMARY KEY, stuname VARCHAR2(20) NOT NULL, cname VARCHAR2(50) NOT NULL, credit NUMBER NOT NULL, score NUMBER ); INSERT INTO studentcourse (stuid,stuname,cname,credit,score) VALUES (1,'张三','Java',3,89); INSERT INTO studentcourse (stuid,stuname,cname,credit,score) VALUES (2,'李四','Java',3,99); INSERT INTO studentcourse (stuid,stuname,cname,credit,score) VALUES (3,'王五','Java',3,78); INSERT INTO studentcourse (stuid,stuname,cname,credit,score) VALUES (1,'张三','Oracle',1,79); INSERT INTO studentcourse (stuid,stuname,cname,credit,score) VALUES (2,'李四','Oracle',1,89);
这种设计符合于第一设计范式,但是不符合于第二范式,因为程序会存在如下的错误:
- 数据重复:学生和课程的数据都处于重复的状态,而且最为严重的是主键的设置问题;
- 数据更新过多:如果说现在一门课程已经有了3000人参加的话,则更改一门课程学分的时候需要修改3000条记录,肯定性能上会有影响;
- 如果一门课程没有一个学生参加,这门课程就从学校彻底消失了;
如果要想解决此问题,则可以将数据表的设计修改如下:
CREATE TABLE student ( stuid NUMBER PRIMARY KEY, stuname VARCHAR2(20) NOT NULL ); CREATE TABLE course ( cid NUMBER PRIMARY KEY, cname VARCHAR2(50) NOT NULL, credit NUMBER NOT NULL ); CREATE TABLE studentcourse ( stuid NUMBER REFERENCES student(stuid), cid NUMBER REFERENCES course(cid), score NUMBER ); INSERT INTO student (stuid,stuname) VALUES (1,'张三'); INSERT INTO student (stuid,stuname) VALUES (2,'李四'); INSERT INTO student (stuid,stuname) VALUES (3,'王五'); INSERT INTO course (cid,cname,credit) VALUES (10,'Java',3); INSERT INTO course (cid,cname,credit) VALUES (11,'Oracle',1); INSERT INTO course (cid,cname,credit) VALUES (12,'Linux',2); INSERT INTO studentcourse (stuid,cid,score) VALUES (1,10,89); INSERT INTO studentcourse (stuid,cid,score) VALUES (2,10,99); INSERT INTO studentcourse (stuid,cid,score) VALUES (3,10,78); INSERT INTO studentcourse (stuid,cid,score) VALUES (1,11,79); INSERT INTO studentcourse (stuid,cid,score) VALUES (2,11,89);
这种设计与之前讲解运动会-项目-成绩的设计是一样的。
三、第三范式:一对多
例如,现在一个学校有多个学生,如果用第一范式无法实现,而如果用第二范式则表示多对多的关系,即:一个学校有多个学生,一个学生在多个学校,不符合于要求,所以此时可以使用第三范式,参考之前的部门和雇员操作实现,一个部门有多个雇员,所以按照设计编写如下:
CREATE TABLE school ( sid NUMBER PRIMARY KEY, sname VARCHAR2(20) NOT NULL ); CREATE TABLE student ( stuid NUMBER PRIMARY KEY, stuname VARCHAR2(20) NOT NULL, sid NUMBER REFERENCES school(sid) );
而在实际的工作之中,第三范式的使用是最多的。
以上的三个范式只是作为参考使用。
相关推荐
Oracle学习笔记(数据库设计范式 PowerDesigner工具),有具体的代码案例
这个笔记是学习oracle数据库过程中整理出来的,比较详细,适合于初学者。 │ oracle与tomcat端口冲突.txt │ Oracle学习笔记.pdf │ Oracle学习笔记.wps │ 安装Oracle后myEclipse不能正常使用.txt │ 手工配置...
13.1按范式要求设计表结构 23 13.2多表连接的种类 23 13.3交叉连接 23 13.4内连接 23 13.5外连接 25 13.6非等值连接 27 13.7表连接总结 27 十四、 集合 28 14.1表连接主要解决的问题 28 14.2集合运算 28 14.3集合...
1NF: 即表的列的具有原子性,不可再分解,即列的信息,不能分解, 只有数据库是关系型数据库(mysql/oracle/db2/informix/sysbase/sql server),就自动的满足1NF ☞ 数据库的分类 关系型数据库: mysql/oracle/db2/...
第二十五章 数据库设计范式 ..................................................................................................... 106 第二十六章 数据库设计工具 .............................................
数据库三范式是什么? union和union all有什么不同? char、varchar2、varchar有什么区别? 合并查询有哪些? SQL语句执行顺序 null的含义 MySQL、SqlServer、oracle写出字符存储、字符串转时间 update语句可以...
保存在oracle数据库中的所有操作细节: spool oracleday01.txt :开始记录 spool off :开始保存细节 四、SELECT语句:选择操作、投影操作。 select:从一个或多个表中检索一个或多个数据列。包含信息:想选择...
DbHelperV2 - Teddy的通用数据库访问组件设计和思考 也论该不该在项目中使用存储过程代替SQL语句 如何使数据库中的表更有弹性,更易于扩展 存储过程——天使还是魔鬼 如何获取MSSQLServer,Oracel,Access中的数据字典...
-- 首先,以超级管理员的身份登录oracle sqlplus sys/bjsxt as sysdba --然后,解除对scott用户的锁 alter user scott account unlock; --那么这个用户名就能使用了。 --(默认全局数据库名orcl) 1、...
│ Java面试题67:数据库优化之数据库表设计遵循范式.mp4 │ Java面试题68:选择合适的数据库引擎.mp4 │ Java面试题69:选择合适的索引.mp4 │ Java面试题70:使用索引的一些技巧.mp4 │ Java面试题71:数据库优化...