【数据库-范式-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
 
相关推荐
阿坤带你走近大数据1 小时前
Oracle存储过程与触发器的详细介绍
数据库·oracle
2401_863318632 小时前
基于RS-232C的串口通信
数据库·mongodb
csdn_aspnet2 小时前
用 MySQL 玩转数据可视化:从底层数据到 BI 工具的桥接
数据库·mysql·信息可视化·bi
明洞日记2 小时前
【软考每日一练013】解析嵌入式网络数据库(NDB)架构
数据库·5g·嵌入式·软考·嵌入式实时数据库
wb043072012 小时前
一次jvm配置问题导致的数据库连接异常
服务器·jvm·数据库·后端
酷酷的崽7982 小时前
搭载cpolar,让PostgreSQL数据库远程访问超丝滑
数据库·postgresql
API开发2 小时前
apiSQL 迁移至已有 PostgreSQL 数据库指南
数据库·postgresql·api开发·postgrest·接口开发工具·api管理软件
学掌门2 小时前
从数据库到可视化性能,5个大数据分析工具测评,python只排倒数
数据库·python·数据分析
编程小风筝2 小时前
Django REST framework实现安全鉴权机制
数据库·安全·django