【数据库-范式-ER图-SQL结合】

范式

参考链接:https://developer.aliyun.com/article/1467681

第一范式1NF:

特点:属性具有原子性,不可再分割;属性值不重复,确保数据完整性和一致性,避免数据冗余(列名是唯一的)

举例:

第二范式:

  1. 要求:非主属性必须完全依赖于候选码,不能部分依赖于候选码。

  2. 部分依赖:如果存在某个非主属性,只需要候选键的一部分就能确定,就是部分依赖。如在复合主键下,非主属性可能存在部份依赖。

  3. 举例解析

解析:候选码为{学生ID,课程ID},非主属性有:

学生姓名:依赖学生ID,ID决定姓名,不需要课程ID,所以非主属性学生姓名部分依赖于候选码,不符合2NF。

课程名称:依赖课程ID,课程ID决定课程名称,不需要学生ID,所以非主属性课程名称部分依赖候选码,不符合2NF。

成绩:依赖于学生ID和课程ID(谁考的哪门课,得出来成绩。要知道一个学生某门课的成绩,必须同时知道是哪个学生(学生ID)和哪门课(课程ID)),所以非主属性成绩完全依赖于候选码,符合2NF。

  1. 规范化作用

通过分解表消除非主属性对候选码的部分依赖,能减少数据冗余,保持数据一致性

规范2NF-分解消除部分依赖

接以上,学生姓名部分依赖候选码;课程名称部分依赖候选码;均不符合2NF,通过拆分表的方式规范化。

表A(学生ID,学生姓名)

表B(课程ID,课程名称)

表C(学生ID,课程ID,成绩)

这样,三张表都与各自的候选码之间形成完全依赖关系,符合2NF。通过分解的方式消除部份依赖,达到每张表都符合2NF的规范。

第三范式

  1. 要求:在满足2NF的基础上,消除非主属性之间的传递依赖,使得非主属性必须完全依赖候选码,而不能依赖其他非主属性。即:非主属性之间是独立的,不能存在依赖关系。

  2. 3NF的作用:

减少数据冗余,在数据完整性和一致性上达到很好的平衡;提高查询效率。

  1. 举例

员工编号-姓名-部门编号-部门名称-部门简介

此时:员工编号是主属性,姓名/部门编号/部门名称/部门简介 均完全依赖主属性。即:确定了一个ID后,就可以确定姓名、所在部门编号、部门名称、部门简介。所以满足2NF。

但,非主属性之间存在传递依赖,部门名称/部门简介依赖于部门编号。即:确定了部门编号后,就可以确定部门名称、部门简介。即:

员工编号------>部门编号------>部门名称;

员工编号------>部门编号------>部门简介;

3NF的要求是非主属性之间不能有依赖,需要把后面两个传递依赖消除,通过拆分表的方式消除传递依赖,减少数据冗余,提高查询效率。

拆分为:员工编号------姓名------部门编号;部门编号------部门名称------部门简介。

规范化3NF-分解消除非主属性之间传递依赖

判断范式:当前属性具有原子性、没有重复属性值,符合1NF;非主属性商品类比id、商品类比名称、商品名称、商品价格完全依赖商品主键id,不存在部份依赖,满足2NF;商品类别名称依赖于商品类别id,存在传递依赖,不满足3NF,会造成大量数据冗余;因此应该拆分表的方式消除非主属性之间的传递依赖,以满足3NF。拆分如下:

表1:商品主键id-商品名称-商品价格-商品类别id

表2:商品类别id-商品类别名称

小结范式优缺点

3NF:消除数据冗余,在数据完整性、一致性上达到很好平衡;但在数据查询上可能需要关联多张表,造成查询效率低。

从关系模型写SQL查询

ER图转关系模型,不多说。

1-N,在N端加入1端主码和联系的属性;

1-1,在任一端加入另一端主码和联系的属性;

M-N,联系作为单独的关系模式,将双方主码加入,联合作为外码,同时联系属性不能缺。

根据关系模型,查询SQL时:

(1)将每个关系模式看作一张表,主码作为表的主键,外码作为表的外键

(2)看查询语句中查的是哪个属性,限制条件分别是哪个属性

(3)(2)中的几个属性分别在哪几个关系模式中(哪几张表中)

(4)这几张表之间有联系吗(外码作为另一个主码),若有,多表查询即可;若么有,引入一个能作为中间桥梁的表就行。

【举例说明】

补全关系模式 参会(会议编号,工号,参会身份);使用(会议编号,资料编号,使用数量);接触(工号,资料编号,接触方式)

(2) 要查询的是人员姓名属性;限制条件1 2022-09-03的会议日期属性;限制条件2 列席的参会身份属性。这三个属性分别属于人员表、会议表、参会表三张表。刚好参会表可以把这三张表串起来,即:多表查询即可。

sql 复制代码
SELECT 人员.姓名 FROM 人员,会议,参会
WHERE 人员.工号=参会.工号 AND 会议.会议编号=参会.会议编号
AND 会议日期="2022-09-03" AND 参会身份="列席"

todo SQL查询

sql 复制代码
where 
having + 聚合函数
avg count+distinct sum 
in(,)
between and
 
相关推荐
加油,小猿猿4 小时前
Java开发日志-双数据库事务问题
java·开发语言·数据库
山岚的运维笔记4 小时前
SQL Server笔记 -- 第20章:TRY/CATCH
java·数据库·笔记·sql·microsoft·sqlserver
Gain_chance4 小时前
33-学习笔记尚硅谷数仓搭建-DWS层交易域用户粒度订单表分析及设计代码
数据库·数据仓库·hive·笔记·学习·datagrip
未来之窗软件服务5 小时前
计算机等级考试—高频英语词汇—东方仙盟练气期
数据库·计算机软考·东方仙盟
lekami_兰5 小时前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
JQLvopkk5 小时前
C# 轻量级工业温湿度监控系统(含数据库与源码)
开发语言·数据库·c#
devmoon6 小时前
在 Polkadot Runtime 中添加多个 Pallet 实例实战指南
java·开发语言·数据库·web3·区块链·波卡
认真的薛薛6 小时前
数据库-sql语句
数据库·sql·oracle
爱学英语的程序员7 小时前
面试官:你了解过哪些数据库?
java·数据库·spring boot·sql·mysql·mybatis
·云扬·8 小时前
MySQL Redo Log落盘机制深度解析
数据库·mysql