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笔记(十六) 数据库设计范式的更多相关文章
- python3.4学习笔记(十六) windows下面安装easy_install和pip教程
python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...
- BCNF/3NF 数据库设计范式简介
数据库设计有1NF.2NF.3NF.BCNF.4NF.5NF.从左往右,越后面的数据库设计范式冗余度越低. 满足后一个设计范式也必定满足前一个设计范式. 1NF只要求每个属性是不可再分的,基本每个数据 ...
- Oracle笔记2-数据库设计
数据库的设计 软件开发的流程:立项->需求分析->概要设计->详细设计->实现->测试->交付->维护 [含数据库设计] 通过需求分析,就可以抽取出关键业务中 ...
- 数据库设计范式1——三范式
一讲到数据库设计,大家很容易想到的就是三范式,但是第四.第五范式又是什么,不是很清楚,三范式到底怎么区分,也不清楚,作为数据库设计的基础概念,我再讲解下数据库范式. Normal form Bri ...
- 【HCIA Gauss】学习汇总-数据库管理(数据库设计 范式 索引 分区)-7
zsql user/pasword@ip:port -c "show databases" # 展示一条sql语句 spool file_path 指定输出文件 可以为相对路径 s ...
- (C/C++学习笔记) 十六. 预处理
十六. 预处理 ● 关键字typeof 作用: 为一个已有的数据类型起一个或多个别名(alias), 从而增加了代码的可读性. typedef known_type_name new_type_nam ...
- python 学习笔记十六 django深入学习一 路由系统,模板,admin,数据库操作
django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ ...
- JavaScript权威设计--CSS(简要学习笔记十六)
1.Document的一些特殊属性 document.lastModified document.URL document.title document.referrer document.domai ...
- Oracle笔记(六) 多表查询
最近看了李兴华的oracle视频,这是网上别人做的笔记非常细致,分享给大家,第六篇 原创地址:http://www.cnblogs.com/mchina/archive/2012/09/07/2651 ...
随机推荐
- k8s install kubeadm网络原因访问不了谷哥and gpg: no valid OpenPGP data found. 解决办法
gpg: no valid OpenPGP data found. 解决办法 待做.................................... 卡助在这curl -s https://pa ...
- Spring Aop(三)——Pointcut表达式介绍
转发地址:https://www.iteye.com/blog/elim-2395255 3 Pointcut表达式介绍 3.1 表达式类型 标准的Aspectj Aop的pointcut的表达式类型 ...
- 4.1 python类的特殊成员,偏函数,线程安全,栈,flask上下文
目录 一. Python 类的特殊成员(部分) 二. Python偏函数 1. 描述 2. 实例一: 取余函数 3. 实例二: 求三个数的和 三. 线程安全 1. 实例一: 无线程,消耗时间过长 2. ...
- unity 读取灰度图生成按高程分层设色地形模型
准备灰度图 1.高程按比例对应hue色相(hsv)生成mesh效果 o.color = float4(hsv2rgb(float3(v.vertex.y/100.0, 0.5, 0.75)), 1.0 ...
- Django:(07)数据库
一.ORM框架 ORM ,Object relational mapping 对象关系映射. 把类和数据库表对应,把对象和表记录对应,通过类和对象操作数据库表中的数据,而不需要编写SQL语句. Dja ...
- vim实现批量注释和批量删除注释
批量注释 1.进入文档,vim test.txt 后,按住ctrl+v进入VISUAL BLOCK模式,上下选择需要注释的行 2.按大写键,再按i,或者直接按shift+i,进入INSERT模式,输入 ...
- leetcode654 Maximum Binary Tree
思路: 使用单调栈可以达到O(n). 实现: /** * Definition for a binary tree node. * struct TreeNode { * int val; * Tre ...
- 最新 竞技世界java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.竞技世界等10家互联网公司的校招Offer,因为某些自身原因最终选择了竞技世界.6.7月主要是做系统复习.项目复盘.Leet ...
- lnmp 命令 及其 TP5 部署遇到的一些问题
1.添加站点域名命令: lnmp vhost add; 2.重置mysql密码: 第一种方法:用军哥的一键修改LNMP环境下MYSQL数据库密码脚本 一键脚本肯定是非常方便.具体执行以下命令: wge ...
- 大周末的不休息,继续学习pandas吧,pandas你该这么学,No.7
其实,写文章真的挺难的 每天抽点时间,写写文采飘逸的文章 坚持个几年,成为称霸一方的大佬 坚持就会成功吧~ 最近碰到瓶颈了, 一直找不到好的运营公众号的方式(好想有人指导唉~,对了,橡皮擦有个100多 ...