【数据库-范式-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
 
相关推荐
REDcker1 小时前
HDR Vivid 技术介绍
数据库·算法·视频·sdr·屏幕·显示技术·dhr
冰暮流星1 小时前
sql语句之union语句
数据库·sql
2401_876381921 小时前
程序人生-Hello’s P2P
数据库·程序人生·p2p
VX:Fegn08951 小时前
计算机毕业设计|基于springboot + vue养老院管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
湘-枫叶情缘2 小时前
从数据库写作到情绪工程:网络文学工程化转向的理论综述
数据库·人工智能
heimeiyingwang2 小时前
企业非结构化数据的 AI 处理与价值挖掘
大数据·数据库·人工智能·机器学习·架构
山岚的运维笔记2 小时前
SQL Server笔记 -- 第63章:事务隔离级别
数据库·笔记·sql·microsoft·oracle·sqlserver
白太岁2 小时前
Redis:(4) 缓存穿透、布隆过滤器与多级缓存
数据库·redis·缓存
LZY16192 小时前
MySQL下载安装及配置
数据库·mysql
亓才孓3 小时前
[Mybatis]Mybatis框架
java·数据库·mybatis