第一范式(1NF)设置了一个有组织的数据库非常基本的规则:

  • 定义所需要的数据项,因为它们成为在表中的列。放在一个表中的相关的数据项。

  • 确保有数据没有重复的组。

  • 确保有一个主键。 PRIMARY KEY (ID)

1NF的第一条规则:

必须定义的数据项。这要求我们数据要被存储,组织数据到列,限定数据的每一列包含什么类型,最后把相关列到自己的表中。

例如,把所有涉及会议地点列到地点表,那些有关会员在会员明细表,等等。

1NF的第二条规则:

下一步骤是确保有数据的无重复组。考虑到我们有如下表:

CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
ORDERS VARCHAR(155)
);

因此,如果我们填充这个表一个客户有多个订单,那么数据如下:

ID NAME AGE ADDRESS ORDERS
100 Sachin 36 Lower West Side Cannon XL-200
100 Sachin 36 Lower West Side Battery XL-200
100 Sachin 36 Lower West Side Tripod Large

但按照1NF,我们需要确保数据没有重复的组。因此,让我们分解上面的表格分为两部分,并使用一个键加入行列如下:

CUSTOMERS 表:

CREATE TABLE CUSTOMERS(
ID INT NOT NULL,
NAME VARCHAR (20) NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR (25),
PRIMARY KEY (ID)
);

此表将有以下记录:

ID NAME AGE ADDRESS
100 Sachin 36 Lower West Side

ORDERS 表 :

CREATE TABLE ORDERS(
ID INT NOT NULL,
CUSTOMER_ID INT NOT NULL,
ORDERS VARCHAR(155),
PRIMARY KEY (ID)
);

此表将具有以下记录:

ID CUSTOMER_ID ORDERS
10 100 Cannon XL-200
11 100 Battery XL-200
12 100 Tripod Large

1NF的第三个规则:

第一范式的最终规则,创建一个主键,我们已经在每个表中创建主键了。

第二范式指出,它应满足所有1NF的规则,必须有任意列不依赖主键关系

考虑客户订单的关系,你想存储客户ID,客户名称,订单ID和订单的细节,以及购买日期:

CREATE TABLE CUSTOMERS(
CUST_ID INT NOT NULL,
CUST_NAME VARCHAR (20) NOT NULL,
ORDER_ID INT NOT NULL,
ORDER_DETAIL VARCHAR (20) NOT NULL,
SALE_DATE DATETIME,
PRIMARY KEY (CUST_ID, ORDER_ID)
);

此表是第一范式,因为它遵循了第一范式的所有规则。在该表中,主键由CUST_ID和ORDERID组成。 它们是唯一的,假设同一客户将很难订购同样的东西。

然而,该表不是在第二范式,因为有主键和列的部分相关性。CUST_NAME依赖于CUST_ID,并有一个客户的名字和他所购买之间没有真正的联系。订单细节和购买日期也取决于ORDERID,但他们不依赖于CUST_ID,因为有一个CUST_ID和订单的详细信息或SALE_DATE之间没有联系。

为了使这个表符合第二范式,需要的列分在三个表。

首先,创建一个表来存储客户的详细信息如下:

CREATE TABLE CUSTOMERS(
CUST_ID INT NOT NULL,
CUST_NAME VARCHAR (20) NOT NULL,
PRIMARY KEY (CUST_ID)
);

接下来,创建一个表来存储每个订单的详细信息:

CREATE TABLE ORDERS(
ORDER_ID INT NOT NULL,
ORDER_DETAIL VARCHAR (20) NOT NULL,
PRIMARY KEY (ORDER_ID)
);

最后,创建第三个表存储只是CUST_ID和ORDER_ID让所有的客户订单可以跟踪:

CREATE TABLE CUSTMERORDERS(
CUST_ID INT NOT NULL,
ORDER_ID INT NOT NULL,
SALE_DATE DATETIME,
PRIMARY KEY (CUST_ID, ORDER_ID)
);

表满足以下条件时就是第三范式:

  • 满足第二范式

  • 所有非主字段都是依赖于主键

非主字段的依赖是数据,例如,在下面的表中,街道名称,城市,国家是可绑定到邮政编码的。

CREATE TABLE CUSTOMERS(
CUST_ID INT NOT NULL,
CUST_NAME VARCHAR (20) NOT NULL,
DOB DATE,
STREET VARCHAR(200),
CITY VARCHAR(100),
STATE VARCHAR(100),
ZIP VARCHAR(12),
EMAIL_ID VARCHAR(256),
PRIMARY KEY (CUST_ID)
);

邮政编码和地址之间的依赖关系称为传递依赖。为了符合第三范式,所有你需要做的是移动的街道,城市和国家领域纳入自己表中,您可以调用邮编表:

CREATE TABLE ADDRESS(
ZIP VARCHAR(12),
STREET VARCHAR(200),
CITY VARCHAR(100),
STATE VARCHAR(100),
PRIMARY KEY (ZIP)
);

接下来,改变CUSTOMERS表如下:

CREATE TABLE CUSTOMERS(
CUST_ID INT NOT NULL,
CUST_NAME VARCHAR (20) NOT NULL,
DOB DATE,
ZIP VARCHAR(12),
EMAIL_ID VARCHAR(256),
PRIMARY KEY (CUST_ID)
);

去掉传递依赖的优势主要有二点。首先,数据的重复的量减少,因此,数据库变得更小。

第二个优点是数据的完整性。当重复数据的变化,还有只更新一些数据,尤其是如果它摊开在多个数据库中不同的地方的一大隐患。例如,如果地址和邮政编码数据存储在三个或四个不同的表,然后在邮政编码的任何变化都需要波及到那些三个或四个表中的每一个记录。

 

总结sql用法及基础语法 第一章 三范式的更多相关文章

  1. 村田噪声抑制基础教程-第一章 需要EMI静噪滤波器的原因

    1-1. 简介 EMI静噪滤波器 (EMIFIL®) 是为电子设备提供电磁噪声抑制的电子元件,配合屏蔽罩和其他保护装置一起使用.这种滤波器仅从通过连线传导的电流中提取并移除引起电磁噪声的元件.第1章说 ...

  2. Java语言程序设计(基础篇)第一章

    第一章 计算机.程序和Java概述 1.1 引言 什么是程序设计呢? 程序设计就是创建(或者开发)软件,软件也称为程序. 1.2 什么是计算机 计算机是存储和处理数据的电子设备,计算机包括硬件(har ...

  3. go基础系列 第一章 go基础语法

    0.前言 1. go定义变量的几种方式 2. go内建变量类型 3. 常量的定义 4. go枚举 5. go的if语句 零. go语言的换行 go语言对换行很有讲究, 如果想换行,必须有一个逗号, 否 ...

  4. C基础入门 - 第一章 - C语言绪言

    第1章 C语言绪言 1.1 C语言概述 1.1.1 C语言世界 1.1.2 C语言学习, 能当饭吃吗 1.2 开发环境构建 1.2.1 visual studio安装使用 1.2.2 visual s ...

  5. sql系列(基础)-第二章 限制和排序数据

    更好的看↑代码点击VIEW PLAN 第二章 约束和排序数据 1. 在 emp 表中选择工资介于 1500 到 2500 的员工的信息: 注意:使用 between 下边界 and 上边界时.条件包括 ...

  6. .NET技术基础总结 ----第一章

    . 一..NET定义 很多人常说我是做.NET开发的,但是,NET到底是什么呢?是一个开发工具?还是一个平台?或者是一个软件环境? 其实,我觉得吧,他是一种概念.一种构想吧.微软的产品发布会上,主持人 ...

  7. DirectX9:基础篇 第一章 初始化Direct3D

    一.简介 二.Direct3D类 1.创建D3D类 IDirect3D9* WINAPI Direct3DCreate9(UINT SDKVersion); //Direct3D类的创建 IDirec ...

  8. python 机器学习基础教程——第一章,引言

    https://www.cnblogs.com/HolyShine/p/10819831.html # from sklearn.datasets import load_iris import nu ...

  9. Python - 基础语法 - 第一天

    编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串. 标识符 第一个字符必须是字母表中字母或下划线 _ . 标识符的其他的部分由字母.数字和下划线 ...

随机推荐

  1. CentOS 中 配置 Nginx 支持 https

    一.基础设置: .yum -y update .yum -y install openssl* .cd /usr/local/nginx/conf .mkdir ./ssl .cd ./ssl # 在 ...

  2. docker 的简单使用

    运行一个ubuntu容器 咱们要在cenots7操作系统下,以docker下载一个ubuntu image文件,然后以image启动容器 docker pull ubuntu 或者指定版本:docke ...

  3. Redis学习---Redis操作之List

    List操作,redis中的List在在内存中按照一个name对应一个List来存储 lpush(name,values) --> 实际上是左添加 # 在name对应的list中添加元素,每个新 ...

  4. Python学习---ModelForm拾遗180325

    ModelForm适用于前台验证和后台直接操作数据库的前后台未做分离,可以一次执行验证和保存数据的场景. 注意:  1.  ModelForm里面没有删除方法,需要手动删除内容 2. ModelFor ...

  5. win10WLAN没有有效的ip配置

    方案一:将路由器和猫重启一下,一般都可以解决了!方案二:1.在开始菜单上单击鼠标右键,选择“命令提示符(管理员)”,如果没有找到这个选项,通过cortana搜索cmd,右键以管理员身份运行,还可以进入 ...

  6. Lonely(非洲NANA作品)

    Lonely(非洲NANA作品) 编辑 Lonely NANA,出生于1968年10月5日的非洲加纳.来自于加纳的NANA出身于一个富有的家庭,但是父亲在他小时候离他们而去,母亲带着年幼的NANA定居 ...

  7. 【ORACLE】使用中注意事项(二)

    问题1:ORACLE在插入数据的时候,有时候中文变成????? 原因:由于当前计算机的字符集和服务器上的字符集不一致,导致中文乱码. 解决方案: 在当前使用的计算机中设置环境变量 在我的电脑上右键属性 ...

  8. 团队作业—预则立&&他山之石(改)

    首先特别感谢刘乾学长腾出他宝贵的时间接受我的采访,为我们提出宝贵的建议,深表感谢. 1.他山之石,可以攻玉.借鉴前人的经验可以使我们减少很多走弯路的地方,这也是本次采访的目的,参考历届学长的经验,让我 ...

  9. DNS Brand

    1) You must add glue records (child nameservers) to your-domain.com from your domain's registrar con ...

  10. Spring 读取配置文件的俩种方式

    读取配置可通过 org.springframework.core.env.Environment 类来获取, 也可以通过@Value的方式来获取 注解形式: @PropertySource({&quo ...