范式:数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的的数据库是需要满足一些。规范的来优化数据数据存储方式。在关系型数据库中这些规范。

第一范式:数据库表中的字段都是单一属性的,不可再分。简单的说,每一个属性都是原子项,不可分割。

1NF是关系模式应具备的最起码的条件,如果数据库设计不能满足第一范式,就不称为关系型数据库。也就是说,只要是关系型数据库,就一定满足第一范式。

 ceate table 学生(
学号 number ,
姓名 varchar2(10),
年龄 varchar2(2),
联系方式 varchar(200)
);

联系方式会有很多,可能包含:地址、电话、邮编、email和QQ等等,所以联系方式可以再分,这样的设计不符合第一范式。

  create table 学生选课(
学生编号 number primary key,
学生姓名 varchar2(20),
学生年龄 number,
课程名称 varchar2(50),
课程学分 number,
考试成绩 number
);
insert into(学生编号,学生姓名,学生年龄,课程名称,课程学分,考试成绩)values(1,'张三',20,‘java',2,89);
insert into(学生编号,学生姓名,学生年龄,课程名称,课程学分,考试成绩)values(2,'李四',20,‘Oracle',1,78);
insert into(学生编号,学生姓名,学生年龄,课程名称,课程学分,考试成绩)values(1,'张三',20,‘Oracle',1,90);

此时的设计包含有如下的问题:

  • 主键信息重复或者说无法确定主键;
  • 学生、课程信息重复(有可能会更新很多的数据);
  • 如果某一门课程没人选择参加,那么课程就没了。

所以此时利用第一范式没有办法解决当前设计问题,改成多对多,成为第二范式。

第二范式:(多对多)数据表中不存在非关键字段对任意一候选关键字段的部分函数依赖。

  • 先通过函数关系进行面描述
  • 函数依赖指的式某几个字段的集合是否可以推到出其他列的内容。(如果一个表中某一个字段A的值是由另外一个字段或一组字段B的值来确定的,就称为A函数依赖于B。)

学生表:

  create table学生(
学生编号 mid primary key,
学生姓名 varchar2(20),
学生年龄 number
)

课程表:

 create table 课程(
课程编号 cid primary key,
课程名称 varchar2(50),
课程学分 number
)

学生_课程表:

 create table 学生_课程(
学生编号 mid references...
课程编号 cid references... )

第三范式:(一对多)

数据表之中不存在非关键字段对任意一候选关键字段传递函数依赖。目标是确保每列都和主键列直接相关,而不是间接相关。

传递依赖是什么意思?现在建立一张雇员表。

雇员编号 姓名 部门 位置 工资
1 张三 测试部 上海 1000

其中存在一个传递依赖:利用编号与姓名可以确定一个雇员的部门,但是通过部门名称又可以找到公司位置。这个称谓传递函数依赖。

现有一个学校有多个学生。如果使用第一设计范式,描述出一个学校有多个学生,但同时又会描述一个学生属于多个学生。所以可以使用第三设计范式。

 create table 学校(
学校编号 number primary key
名称 varchar2(50)
); create table 学生(
学生编号 mid primary key,
学生姓名 varchar2(20),
学生年龄 number
学校编号 number references...
);

注:关系实质上是一张二维表,其中每一行是一个元组,每一列是一个属性。

数据不能存在传递关系,即没个属性都跟主键有直接关系而不是间接关系。像:a-->b-->c  属性之间含有这样的关系,是不符合第三范式的。

再比如Student表(学号,姓名,年龄,性别,所在院校,院校地址,院校电话)

这样一个表结构,就存在上述关系。 学号--> 所在院校 --> (院校地址,院校电话)

这样的表结构,我们应该拆开来,如下。

(学号,姓名,年龄,性别,所在院校)--(所在院校,院校地址,院校电话)

总结:三个设计范式只是一个设计初的思考方式。但是在实际运行中,这三个必须要打破。

Oracle 三大范式的更多相关文章

  1. oracle三大范式

    范式: 设计数据库定义的一个规则, 三大范式, 灵活运用, 人的思想是活的 一范式 1, 不存在冗余数据 同一个表中的记录不能有重复----所以主键(必须有) 2, 每个字段必须是不可再分的信息(列不 ...

  2. oracle三大范式(转载)

    标准化表示从你的数据存储中移去数据冗余 (redundancy)的过程.如果数据库设计达到了完全的标准化,则把所有的表通过关键字连接在一起时,不会出现任何数据的复本 (repetition).标准化的 ...

  3. 2.4 Oracle之DCL的SQL语句之用户权限以及三大范式

    DCL   (Data Control Language,数据库控制语言)用于定义数据库权限 一.用户权限 1.1  建立用户以及授权: Eg :CREATE USER 用户名  IDENTIFIED ...

  4. SqlServer之数据库三大范式

    分析: 数据库设计应遵循三大范式分别为: 第一范式:确保表中每列的原子性(不可拆分): 第二范式:确保表中每列与主键相关,而不能只与主键的某部分相关(主要针对联合主键),主键列与非主键列遵循完全函数依 ...

  5. 数据库的设计(E-R图,数据库模型图,三大范式)

    一.数据库设计的概念 数据库设计是将数据库中的数据实体及这些数据实体之间的关系,进行规划和结构化的过程. 二.数据库设计的重要性 如果一个数据库没有进行一个良好的设计,那么这个数据库完成之后他的缺点是 ...

  6. MySql三大范式与数据库设计和表创建常用语句

    [数据库设计的三大范式] 1.第一范式(1NF First Normal Fromate):数据表中的每一列(字段),必须是不可拆分的最小单元.也就是确保每一列的原子性. 例如: userInfo: ...

  7. MySQL(三)之SQL语句分类、基本操作、三大范式

    一.SQL语句的分类     DML(Data Manipulation Langauge,数据操纵/管理语言) (insert,delete,update,select)     DDL(Data ...

  8. 【SqlServer系列】数据库三大范式

    1   概述 一般地,在进行数据库设计时,应遵循三大原则,也就是我们通常说的三大范式,即第一范式要求确保表中每列的原子性,也就是不可拆分:第二范式要求确保表中每列与主键相关,而不能只与主键的某部分相关 ...

  9. Mysql 数据库设置三大范式 数据库五大约束 数据库基础配置

    数据库设置三大范式 1.第一范式(确保每列保持原子性) 第一范式是最基本的范式.如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库满足第一范式. 第一范式的合理遵循需要根据系统给的实际需求 ...

随机推荐

  1. 【转载】大连商品交易所-新套利撮合算法FAQ

    原文网址:http://www.dce.com.cn/dalianshangpin/yw/fw/ywzy/jyywzy/498201/1500371/index.html   大连商品交易所 新套利撮 ...

  2. 1.Jenkins 在windows下的安装与配置

    1. 安装Jenkins 1.war包安装:启动Jenkins命令,打开cmd至Jenkins安装目录下,运行命令 java -jar jenkins.war 如果改变默认端口,则指定端口例如端口号1 ...

  3. 【Selenium2】【HTMLTestRunner】

    在拜读虫师大神的Selenium2+Python2.7时,发现生成HTMLTestRunner的测试报告使用的HTMLTestRunner的模块是用的Python2的语法.而我本人比较习惯与Pytho ...

  4. Educational Codeforces Round 23 F. MEX Queries 离散化+线段树

    F. MEX Queries time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...

  5. Navicat for MySQL用ssh功能连接远程数据库

    转载自:http://holy2010.blog.51cto.com/1086044/518431 实现用本地的ssh隧道起到加密功能 在windows平台上运行Navicat for MySQL(h ...

  6. java进程占用系统内存高,排查解决

    转自:http://blog.51cto.com/chengxiaobai/2052530?cid=695076 故障:最近收到生产服务器的报警短信以及邮件,报警内容为:内存使用率高于70%. 使用t ...

  7. JSON parse error: Cannot deserialize instance of `int` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc

    代码程序: @PostMapping("selectById") @ResponseBody public Result selectById(@RequestBody int i ...

  8. Mysql一些常用语句

    1.查询表创建的时间: SELECT CREATE_TIME FROM INFORMATION_SCHEMA.TABLES WHERETABLE_NAME='TableName'

  9. pandas计数 value_counts()

    来自:曹骥 在pandas里面常用value_counts确认数据出现的频率. 1. Series 情况下: pandas 的 value_counts() 函数可以对Series里面的每个值进行计数 ...

  10. zzulioj 1206 字符串的修改 (字符串修改)

    不难,理解一下直接过,代码如下: #include<stdio.h> #include<string.h> #include<math.h> #include< ...