mysql三范式
mysql数据库面试题

软件⼯程师面试题-MySQL-V1.01目录前⾔5 MySQL面试题61.MySQL中有哪⼏种锁?62.MySQL中有哪些不同的表格?63.简述在MySQL数据库中MyISAM和InnoDB的区别64.MySQL中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?75.CHAR和VARCHAR的区别?76.主键和候选键有什么区别?87.myisamchk是用来做什么的?88.如果一个表有一列定义为TIMESTAMP,将发⽣什么?89.你怎么看到为表格定义的所有索引?810.LIKE声明中的%和_是什么意思?911.列对比运算符是什么?912.BLOB和TEXT有什么区别?913.MySQL_fetch_array和MySQL_fetch_object的区别是什么?914.MyISAM表格将在哪里存储,并且还提供其存储格式?915.MySQL如何优化DISTINCT?1016.如何显示前50⾏?1017.可以使用多少列创建索引?1018.NOW()和CURRENT_DATE()有什么区别?1019.什么是非标准字符串类型?1020.什么是通用SQL函数?1121.MySQL支持事务吗?1122.MySQL里记录货币用什么字段类型好1123.MySQL有关权限的表都有哪⼏个?1224.列的字符串类型可以是什么?1225.MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?1226.锁的优化策略1327.索引的底层实现原理和优化1328.什么情况下设置了索引但⽆法使用1329.实践中如何优化MySQL1330.优化数据库的⽅法1431.简单描述MySQL中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两⽅面)1432.数据库中的事务是什么?1533.SQL注⼊漏洞产⽣的原因?如何防⽌?1634.为表中得字段选择合适得数据类型1635.存储日期时间1636.对于关系型数据库⽽⾔,索引是相当重要的概念,请回答有关索引的⼏个问题:1737.解释MySQL外连接、内连接与自连接的区别1838.Myql中的事务回滚机制概述1839.SQL语⾔包括哪⼏部分?每部分都有哪些操作关键字?1940.完整性约束包括哪些?1941.什么是锁?2042.什么叫视图?游标是什么?2043.什么是存储过程?用什么来调用?2044.如何通俗地理解三个范式?2145.什么是基本表?什么是视图?2146.试述视图的优点?2147.NULL是什么意思2248.主键、外键和索引的区别?2249.你可以用什么来确保表格里的字段只接受特定范围里的值?2250.说说对SQL语句优化有哪些⽅法?(选择⼏条)224软件⼯程师面试题-MYSQL V1.0MySQL面试题1.MySQL中有哪⼏种锁?1、表级锁:开销小,加锁快;不会出现死锁;锁定粒度⼤,发⽣锁冲突的概率最⾼,并发度最低。
数据库基础知识整理与复习总结

数据库基础知识整理与复习总结关系型数据库MySQL1、数据库底层MySQL数据库的底层是B+树。
说到B+树,先说下B树,B树也叫多路平衡查找树,所有的叶⼦节点位于同⼀层,具有以下特点:1)⼀个节点可以容纳多个值;2)除⾮数据已满,不会增加新的层,B树追求最少的层数;3)⼦节点中的值与⽗节点的值有严格的⼤⼩对应关系。
⼀般来说,如果⽗节点有a个值,那么就有a+1个⼦节点;4)关键字集合分布在整棵树中;5)任何⼀个关键字出现且只出现在⼀个节点中;6)搜索可能在叶⼦结点结束,其搜索性能等价于在关键字全集做⼀次⼆分查找。
B+树是基于B树和叶⼦节点顺序访问指针进⾏实现,它具有B树的平衡性,并且通过顺序访问指针来提⾼区间查询的性能,⼀个叶⼦节点中的key从左⾄右⾮递减排列。
特点在于:1)⾮叶⼦节点中含有n个关键字,关键字不保存数据,只作为索引,所有数据都保存在叶⼦结点;2)有的叶⼦节点中包含了全部关键字的信息及只想这些关键字记录的指针,即叶⼦节点包含链表结构,能够⽅便进⾏区间查询;3)所有的⾮叶⼦结点可以看成是索引部分,节点中仅包含其⼦树中的最⼤(或最⼩)关键字;4)同⼀个数字会在不同节点中重复出现,根节点的最⼤元素就是B+树的最⼤元素。
MySQL中的InnoDB引擎是以主键ID为索引的数据存储引擎。
InnoDB通过B+树结构对ID建⽴索引,在叶⼦节点存储数据。
若建索引的字段不是主键ID,则对该字段建索引,然后再叶⼦节点中存储的是该记录的主键,然后通过主键索引找到对应的记录。
因为不再需要全表扫描,只需要对树进⾏搜索即可,所以查找速度很快,还可以⽤于排序和分组。
InnoDB和MyISAM引擎都是基于B+树,InnoDB是聚簇索引,数据域存放的是完整的数据记录;MyISAM是⾮聚簇索引,数据域存放的是数据记录的地址。
InnoDB⽀持表锁、⾏锁、间隙锁、外键以及事务,MyISAM仅⽀持表锁,同时不⽀持外键和事务。
InnoDB注重事务,MyISAM注重性能。
举例说明mysql三范式

举例说明mysql三范式文章标题:MySQL三范式简介及实例解析引言:在数据库设计和规范化过程中,三范式是一种重要的理论概念。
MySQL 作为最受欢迎的开源关系型数据库管理系统之一,广泛应用于Web应用程序和企业级应用中。
本文将详细介绍MySQL三范式,并通过一系列实例来解释三范式的概念和应用。
第一节:概念介绍1. 什么是三范式三范式是关系数据库设计的理论基础,通过规范化数据模型,避免数据冗余和数据不一致性。
三范式分别为第一范式(1NF)、第二范式(2NF)和第三范式(3NF),每个范式都有其特定的目标和规则。
2. 第一范式(1NF)第一范式要求数据表的每个列都必须是原子的、不可分割的数据项。
换句话说,每个列不应该包含多个值。
3. 第二范式(2NF)第二范式要求在满足第一范式的基础上,非主键列完全依赖于主键。
也就是说,表中的每个非主键列都必须完全依赖于主键,而不能只依赖于部分主键。
4. 第三范式(3NF)第三范式进一步要求在满足第二范式的基础上,非主键列之间不存在传递依赖关系。
换句话说,非主键列之间没有直接或间接的依赖关系。
第二节:实例解析为了更好地理解MySQL三范式的概念和应用,以下是一个电子商务网站的数据库设计实例。
1. 第一范式实例假设我们有一个用户表(User),其中有以下几个列:用户ID(UserID)、用户名(Username)和联系方式(ContactInfo)。
为了符合第一范式,我们需要确保每个列都是原子的。
因此,我们可以把用户的联系方式拆分成电子邮件地址(Email)和电话号码(PhoneNumber)两个列。
2. 第二范式实例在第一范式的基础上,我们需要确保非主键列完全依赖于主键。
假设我们已经将用户表分成两个表,一个是用户信息表(UserInfo),另一个是联系方式表(Contact)。
用户信息表包含UserID和Username两列,联系方式表包含UserID、Email和PhoneNumber三列。
简述数据库设计3个范式的含义

数据库设计是指按照特定的规范和要求,对数据库的数据存储和管理进行规划和设计的过程。
数据库设计的三个范式是指数据库设计中的基本规范,其中第一范式(1NF)、第二范式(2NF)和第三范式(3NF)分别规定了数据库中的数据应该满足的标准和要求。
下面我们将简要介绍数据库设计的三个范式的含义。
一、第一范式(1NF)1. 第一范式是指数据库表中的所有字段都是不可再分的最小单元,即每个数据项都是不可再分的,不能再被分割为更小的数据项。
2. 数据库表中的每一列都是单一的值,不可再分。
3. 所有的字段都应该是原子性的,即不能再分。
4. 如果数据库表中的字段不满足第一范式的要求,就需要进行适当的调整和修改,使之满足第一范式的要求。
二、第二范式(2NF)1. 第二范式是指数据库表中的所有非主属性都完全依赖于全部主键。
2. 所谓主属性是指唯一标识一个记录的属性,而非主属性是指与主键相关的其他属性。
3. 如果一个表中的某些字段与主键没有直接关系,而是依赖于其他字段,则需要将这些字段拆分到另一个表中。
4. 通过将非主属性与主键分离,可以避免数据冗余和更新异常。
5. 第二范式要求数据库表中的数据项应该是唯一的,不可再分,且完全依赖于全部主键。
三、第三范式(3NF)1. 第三范式是指数据库表中的所有字段都不依赖于其他非主字段。
2. 也就是说,一个表中的字段之间应该相互独立,不应该存在字段之间的传递依赖关系。
3. 如果一个字段依赖于其他非主字段,则应该将其拆分到另一张表中,以避免数据冗余和更新异常。
4. 第三范式要求数据库表中的字段之间应该是独立的,不应该存在传递依赖关系。
数据库设计的三个范式分别规范了数据库表中数据的原子性、依赖性和独立性。
遵循这些范式可以有效地减少数据冗余和更新异常,提高数据库的数据完整性和稳定性。
在进行数据库设计时,设计人员应该严格遵循这些范式的要求,以确保数据库的高效性和可靠性。
众所周知,数据库设计的三个范式是设计和维护关系型数据库时非常重要的标准和指导原则。
MySQL数据库学习笔记

MySQL数据库学习笔记数据库 DDL: 数据定义语⾔, 包含数据库和表相关的操作(MySQL中保存数据需要先建库再建表,最后把数据保存到表中) DML: 数据操作语⾔, 包含增删改查相关的SQL DQL: 数据查询语⾔, 只包含查询相关的SQL TCL: 事务控制语⾔, 包括和事务相关的SQL DCL: 数据控制语⾔, 包括⽤户管理及权限分配相关的SQLDDL数据定义语⾔ 数据库相关SQL 1. 查询所有数据库 show databases; 2. 创建数据库 格式: create database 数据库名; 指定字符集格式: create database 数据库名 character set utf8/gbk; 举例: create database db1; create database db2 character set utf8; create database db3 character set gbk; show databases; 3. 查询数据库详情 格式: show create database 数据库名; 举例: show create database db1; show create database db2; show create database db3; 4. 删除数据库 格式: drop database 数据库名; drop database db3; 5. 使⽤数据库必须使⽤了某个数据库之后才能执⾏表和数据相关的SQL 格式: use 数据库名; use db1; 表相关SQL 操作表相关的SQL 必须使⽤了某个数据库之后再操作use db1; 1. 创建表 格式: create table 表名(字段1名类型,字段2名类型); 指定字符集格式: create table 表名(字段1名类型,字段2名类型) charset=utf8/gbk; 举例: create table person (name varchar(20),age int); create table student(name varchar(20),score int) charset=utf8; create table car(name varchar(20),price int) charset=gbk; 2. 查询所有表 格式: show tables; 3. 查询表详情 格式: show create table 表名 举例: show create table person; 4. 查看表字段 格式: desc 表名; 举例: desc student; 5. 删除表 格式: drop table 表名 举例: drop table car; 表相关SQL(续) use db1; 1. 修改表名格式: rename table 原名 to 新名; rename table student to stu; 2. 添加表字段 最后添加格式: alter table 表名 add 字段名类型; 最前⾯添加个格式: alter table 表名 add 字段名类型 fifirst; xxx字段后⾯添加格式: alter table 表名 add 字段名类型 after xxx; 举例: alter table person add gender varchar(5); //最后⾯ alter table person add id int fifirst; //最前⾯ alter table person add salary int after name;//name后⾯ 3. 删除表字段 格式: alter table 表名 drop 字段名; alter table person drop salary; 4. 修改表字段 格式: alter table 表名 change 原名新名新类型; alter table person change gender salary int;DML数据操作语⾔(数据相关SQL语句) 1. 插⼊数据 全表插⼊格式: insert into 表名 values(值1,值2); 值的数量和表字段⼀致 批量插⼊格式: insert into 表名 values(值1,值2),(值1,值2),(值1,值2); 举例: insert into person values("Tom",18); //全表插⼊ insert into person(name) values("Jerry"); //指定字段插⼊ insert into person values("AAA",10),("BBB",20), ("CCC",30); 中⽂问题: insert into person values("刘德华",30); 如果执⾏上⾯包含中⽂的SQL 报以下错误执⾏ set names gbk; 2. 查询数据 格式: select 字段信息 from 表名 where 条件; 举例: select name from person; //查询表中所有的名字 select name,age from person; //查询表中所有名字和年龄 select * from person; //查询表中所有数据的所有字段信息 select * from person where age>20; //查询年龄⼤于20岁的信息 select * from person where name='Tom'; //查询Tom的信息 3. 修改数据 格式: update 表名 set xxx=xxx,xxx=xxx where 条件; 举例: update person set age=8 where name='Jerry'; update person set name="张学友",age=50 where name="刘德华"; update person set age=15 where age<20; 4. 删除数据 格式: delete from 表名 where 条件; 举例: delete from person where name='Tom'; delete from person where age<20; delete from person; 约束* 概念:对表中的数据进⾏限定,保证数据的正确性、有效性和完整性。
第一第二范式第三范式关系

第一第二范式第三范式关系关系数据库是现代应用开发中常用的数据存储和管理方式,而范式化是一种设计数据库的方法。
在关系数据库中,范式分为第一范式(1NF)、第二范式(2NF)和第三范式(3NF)。
本文将介绍三个范式的概念、原则和关系,以帮助读者更好地理解和运用范式化方法。
第一范式是关系数据库设计中的基本要求,它要求每个数据列都是原子的,不可再分。
具体来说,每个表的每个字段都只能有一个单一值,不能包含多个值或重复的分组。
这样可以确保数据的唯一性和一致性,方便数据的查询和管理。
例如,一个学生信息表应该将学生姓名、学号、性别等信息分开存储,而不是将它们合并在一个字段中。
第二范式在第一范式的基础上进一步规范了关系数据库的设计。
第二范式要求每个非主键字段都完全依赖于主键,即非主键字段必须和主键直接相关,而不能和其他非主键字段相关。
这种规范化可以避免数据的冗余和更新异常。
举个例子,一个订单表中,订单号是主键,订单日期和客户名称完全依赖于订单号,而不是互相依赖。
第三范式在第二范式的基础上进一步规范了数据库的设计。
第三范式要求所有非主键字段都不传递依赖于主键,即非主键字段之间不能相互依赖。
这样可以消除数据冗余和处理更新异常的可能性。
例如,一个员工表中,员工编号是主键,部门号和部门名称之间存在函数依赖关系,因此应该将它们分开存储,而不是将部门名称作为员工表的字段。
范式化的好处是可以提高数据的一致性、完整性和可维护性,减少数据冗余和更新异常的可能性。
但过度范式化也可能导致查询性能下降,因此在实际应用中需要权衡范式化和性能的关系。
一般来说,高频查询的字段可以冗余存储,以提高查询性能,但需要注意保持数据的一致性。
在数据库设计过程中,应该根据实际需求选择合适的范式化级别。
如果数据结构相对简单,可以选择较高的范式化级别;如果数据结构复杂,可以适当冗余存储以提高查询性能。
同时,还可以使用索引、优化查询语句等方法来提高数据库的性能。
mysql第一范式第二范式第三范式的定义

mysql第一范式第二范式第三范式的定义MySQL是一种关系型数据库管理系统(RDBMS),它使用了结构化查询语言(SQL)来管理和操作数据。
在数据库设计过程中,有三个关键的范式,即第一范式(1NF),第二范式(2NF)和第三范式(3NF)。
这些范式的目标是确保数据库中的数据不会出现冗余,以便提高数据的一致性和可靠性。
1.第一范式:第一范式是指关系数据库中的每个表都应该具备原子性。
这意味着每个表中的每一列都应该包含单一的数据值,而不是一个组合或者一个以逗号分隔的列表。
这就要求将数据分解成最小单元,以确保表中的每一列都具有独立性和单一性。
如果一个表违反了第一范式,那么就需要进一步拆分该表。
例如,考虑一个表格存储了学生的信息,如果将学生的姓名和电话号码存储在同一个列中,那么这个表就违反了第一范式。
为了符合第一范式,应将姓名和电话号码分开存储,每个属性有一个独立的列。
2.第二范式:第二范式是指一个表中的非键属性完全依赖于表中的主键。
简单来说,这意味着一个表中的每个非键属性都应该与主键有一一对应的关系,而不是与部分主键相关。
为了满足第二范式,我们可以将数据分解成更小的表,将非键属性与与之相关的主键属性放在同一个表中。
这样可以避免数据冗余和不一致性。
例如,考虑一个订单表,该表中包含订单编号、产品编号和产品描述。
如果产品描述与产品编号不直接依赖于订单编号,而是与订单编号和产品编号的组合有关,那么这个表就违反了第二范式。
为了符合第二范式,应该将产品描述移动到与产品编号相关联的表中。
3.第三范式:第三范式是指一个表中的非键属性不应该传递依赖于其他非键属性。
这意味着一个表中的每个非键属性都应该直接依赖于主键,而不是依赖于其他属性。
为了满足第三范式,可以进一步将表分解,以确保每个非键属性只依赖于主键。
这样可以减少数据冗余和数据更新异常,并提高数据完整性和一致性。
例如,考虑一个员工表,该表中包含员工编号、员工姓名、部门编号和部门名称。
MySQL数据库三大范式

MySQL数据库三⼤范式第⼀范式(1NF) 所谓第⼀范式(1NF)是指在关系模型中,对域添加的⼀个规范要求,所有的域都应该是原⼦性的,即数据库表的每⼀列都是不可分割的原⼦数据项,⽽不能是集合,数组,记录等⾮原⼦数据项。
即实体中的某个属性有多个值时,必须拆分为不同的属性。
在符合第⼀范式(1NF)表中的每个域值只能是实体的⼀个属性或⼀个属性的⼀部分。
简⽽⾔之,第⼀范式就是⽆重复的域。
说明:在任何⼀个关系数据库中,第⼀范式(1NF)是对关系模式的设计基本要求,⼀般设计中都必须满⾜第⼀范式(1NF)。
不过有些关系模型中突破了1NF的限制,这种称为⾮1NF的关系模型。
换句话说,是否必须满⾜1NF的最低要求,主要依赖于所使⽤的关系模型。
第⼆范式(2NF) 在1NF的基础上,⾮码属性必须完全依赖于候选码(在1NF基础上消除⾮主属性对主码的部分函数依赖。
第⼆范式(2NF)是在第⼀范式(1NF)的基础上建⽴起来的,即满⾜第⼆范式(2NF)必须先满⾜第⼀范式(1NF)。
第⼆范式(2NF)要求数据库表中的每个实例或记录必须可以被唯⼀地区分。
选取⼀个能区分每个实体的属性或属性组,作为实体的唯⼀标识。
例如在员⼯表中的⾝份证号码即可实现每个⼀员⼯的区分,该⾝份证号码即为候选键,任何⼀个候选键都可以被选作主键。
在找不到候选键时,可额外增加属性以实现区分,如果在员⼯关系中,没有对其⾝份证号进⾏存储,⽽姓名可能会在数据库运⾏的某个时间重复,⽆法区分出实体时,设计辟如ID等不重复的编号以实现区分,被添加的编号或ID选作主键。
(该主键的添加是在ER设计时添加,不是建库时随意添加) 第⼆范式(2NF)要求实体的属性完全依赖于主关键字。
所谓完全依赖是指不能存在仅依赖主关键<字⼀部分的属性,如果存在,那么这个属性和主关键字的这⼀部分应该分离出来形成⼀个新的实体,新实体与原实体之间是⼀对多的关系。
为实现区分通常需要为表加上⼀个列,以存储各个实例的唯⼀标识。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据库的设计范式是数据库设计所需要满足的规范,满足这些规范的数据库是简洁的、结构明晰的,同时,不会发生插入(insert)、删除(delete)和更新(update)操作异常。
反之则是乱七八糟,不仅给数据库的编程人员制造麻烦,而且面目可憎,可能存储了大量不需要的冗余信息。
范式说明
1.1 第一范式(1NF)无重复的列
所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。
如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。
在第一范式(1NF)中表的每一行只包含一个实例的信息。
简而言之,第一范式就是无重复的列。
说明:在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
例如,如下的数据库表是符合第一范式的:
而这样的数据库表是不符合第一范式的:
数据库表中的字段都是单一属性的,不可再分。
这个单一属性由基本类型构成,包括整型、实数、字符型、逻辑型、日期型等。
很显然,在当前的任何关系数据库管理系统(DBMS)中,傻瓜也不可能做出不符合第一范式的数据库,因为这些DBMS不允许你把数据库表的一列再分成二列或多列。
因此,你想在现有的DBMS中设计出不符合第一范式的数据库都是不可能的。
1.2 第二范式(2NF)属性完全依赖于主键 [ 消除部分子函数依赖 ]
如果关系模式R为第一范式,并且R中每一个非主属性完全函数依赖于R的某个候选键,则称为第二范式模式。
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。
第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。
为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。
这个惟一属性列被称为主关键字或主键、主码。
例如员工信息表中加上了员工编号(emp_id)列,因为每个员工的员工编号是惟一的,因此每个员工可以被惟一区分。
简而言之,第二范式(2NF)就是非主属性完全依赖于主关键字。
所谓完全依赖是指不能存在仅依赖主关键字一部分的属性(设有函数依赖W→A,若存在XW,有X→A成立,那么称W→A是局部依赖,否则就称W→A是完全函数依赖)。
如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。
假定选课关系表为SelectCourse(学号, 姓名, 年龄, 课程名称, 成绩, 学分),关键字为组合关键字(学号, 课程名称),因为存在如下决定关系:
(学号, 课程名称) → (姓名, 年龄, 成绩, 学分)
这个数据库表不满足第二范式,因为存在如下决定关系:
(课程名称) → (学分)
(学号) → (姓名, 年龄)
即存在组合关键字中的字段决定非关键字的情况。
由于不符合2NF,这个选课关系表会存在如下问题:
(1) 数据冗余:
同一门课程由n个学生选修,"学分"就重复n-1次;同一个学生选修了m门课程,姓名和年龄就重复了m-1次。
(2) 更新异常:
若调整了某门课程的学分,数据表中所有行的"学分"值都要更新,否则会出现同一门课程学分不同的情况。
(3) 插入异常:
假设要开设一门新的课程,暂时还没有人选修。
这样,由于还没有"学号"关键字,课程名称和学分也无法记录入数据库。
(4) 删除异常:
假设一批学生已经完成课程的选修,这些选修记录就应该从数据库表中删除。
但是,与此同时,课程名称和学分信息也被删除了。
很显然,这也会导致插入异常。
把选课关系表SelectCourse改为如下三个表:
学生:Student(学号, 姓名, 年龄);
课程:Course(课程名称, 学分);
选课关系:SelectCourse(学号, 课程名称, 成绩)。
这样的数据库表是符合第二范式的,消除了数据冗余、更新异常、插入异常和删除异常。
另外,所有单关键字的数据库表都符合第二范式,因为不可能存在组合关键字。
1.3 第三范式(3NF)属性不依赖于其它非主属性 [ 消除传递依赖 ]
如果关系模式R是第二范式,且每个非主属性都不传递依赖于R的候选键,则称R为第三范式模式。
满足第三范式(3NF)必须先满足第二范式(2NF)。
第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。
例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。
那么在的员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。
如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。
第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。
简而言之,第三范式就是属性不依赖于其它非主属性。
所谓传递函数依赖,指的是如果存在"A → B → C"的决定关系,则C传递函数依赖于A。
因此,满足第三范式的数据库表应该不存在如下依赖关系:
关键字段→非关键字段x →非关键字段y
假定学生关系表为Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话),关键字为单一关键字"学号",因为存在如下决定关系:
(学号) → (姓名, 年龄, 所在学院, 学院地点, 学院电话)
这个数据库是符合2NF的,但是不符合3NF,因为存在如下决定关系:
(学号) → (所在学院) → (学院地点, 学院电话)
即存在非关键字段"学院地点"、"学院电话"对关键字段"学号"的传递函数依赖。
它也会存在数据冗余、更新异常、插入异常和删除异常的情况,读者可自行分析得知。
把学生关系表分为如下两个表:
学生:(学号, 姓名, 年龄, 所在学院);
学院:(学院, 地点, 电话)。
这样的数据库表是符合第三范式的,消除了数据冗余、更新异常、插入异常和删除异常。
1.4 鲍依斯-科得范式(BCNF是3NF的改进形式)
若关系模式R是第一范式,且每个属性都不传递依赖于R的候选键。
这种关系模式就是BCNF模式。
即在第三范式的基础上,数据库表中如果不存在任何字段对任一候选关键字段的传递函数依赖则符合鲍依斯-科得范式。
假设仓库管理关系表为StorehouseManage(仓库ID, 存储物品ID, 管理员ID, 数量),且有一个管理员只在一个仓库工作;一个仓库可以存储多种物品。
这个数据库表中存在如下决定关系:
(仓库ID, 存储物品ID) →(管理员ID, 数量)
(管理员ID, 存储物品ID) → (仓库ID, 数量)
所以,(仓库ID, 存储物品ID)和(管理员ID, 存储物品ID)都是StorehouseManage的候选关键字,表中的唯一非关键字段为数量,它是符合第三范式的。
但是,由于存在如下决定关系:
(仓库ID) → (管理员ID)
(管理员ID) → (仓库ID)
即存在关键字段决定关键字段的情况,所以其不符合BCNF范式。
它会出现如下异常情况:
(1) 删除异常:
当仓库被清空后,所有"存储物品ID"和"数量"信息被删除的同时,"仓库ID"和"管理员ID"信息也被删除了。
(2) 插入异常:
当仓库没有存储任何物品时,无法给仓库分配管理员。
(3) 更新异常:
如果仓库换了管理员,则表中所有行的管理员ID都要修改。
把仓库管理关系表分解为二个关系表:
仓库管理:StorehouseManage(仓库ID, 管理员ID);
仓库:Storehouse(仓库ID, 存储物品ID, 数量)。
这样的数据库表是符合BCNF范式的,消除了删除异常、插入异常和更新异常。
四种范式之间存在如下关系:
------------------------ Dylan Presents.。