SQL基础随记3 范式 键
SQL基础随记3 范式 键
什么是范式?哈,自己设计会使用但是一问还真说不上来。遂将不太明晰的概念整体下
什么是 & 分类
范式(NF),一种规范,设计数据库模型时对关系内部各个属性之间的联系的合理化程度的不同等级的规范要求。
分类:
- 1NF、2NF、3NF、BCNF(巴斯科德范式)、4NF、5NF(完美范式)
低阶范式是高阶范式的基础,范式等级越高冗余度越低,使用时越容易进行join
键
- 超键:能唯一表示元组(元组也就是一行数据,一条记录)的属性的集合。超键可能包含多余属性。如身份证号+学生id+姓名
- 候选键:不包含多余属性的超键。候选键可能不唯一,身份证号或学生id都可以当做候选键。
- 主键
- 外键
属性
- 主属性:任意候选键的属性就是主属性
- 非主属性
依赖
- 依赖:一个或一组属性的值决定其他属性的值
- 完全依赖:某个非主属性于所有主属性
- 部分依赖
- 传递依赖:若存在 "A>>B>>C"的依赖关系,则C传递依赖于A
Each NF
1NF:表中任何属性都是原子性的(不可拆分的),所有 RDBMS都满足。
2NF:任意一个非主属性都要与
主属性/候选键完全依赖,消除非主属性对候选码的部分依赖。若不满足2NF会造成
数据冗余
增删改异常
不满足2NF举例
球员id决定球员姓名等球员个人信息
比赛id决定比赛时间、比赛场地等比赛信息
若将上述所有属性放在一张表中就会造成
数据冗余:异常比赛有n个球员参加,那么记录该场比赛n个球员信息时,对应的比赛信息就多余了n-1次
增删改异常:仅根据球员id或比赛id进行操作时,
增:不知道另一个主属性导致无法插入
删:会删除另一个主属性以及其对应的信息
改:修改信息时,有改信息的所有记录都要修改
3NF:在第二范式的基础上,任意一个非主属性都不传递依赖于候选键
不满足3NF但满足2NF举例
表1:球员id、球员姓名、球队名称、主教练姓名
球员姓名、球队名称、主教练姓名都可以由球员id决定
但是主教练姓名也可以通过球队名称决定,这就出现了传递依赖
如果我们将表1拆分成
表2:球员id、球员姓名、球队名称
表3:球队名称、主教练名称
则满足3NF
致命总结
在第一范式的基础上,根据"非主完全依赖主属性"对所有属性进行划分并给每张表加id就满足第二范式,再细分属性消除传递依赖加上FOREIGN KEY就满足第三范式
BCNF、4NF、5NF查询效率极低,很少用到,开发效率和查询效率都很感人。
反范式
一般情况下,业务界面会显示用户姓名而不是用户ID,因此常常需要将user表与其他表连接查询。因此当数据量较大时可以将user id 与 use name 在其他常用表中“冗余",这样可以只进行单表扫描。而不用在大数据量的情况下再连接查询。

反范式设计与数据仓库
数据仓库与数据库的区别:
- 数据库用于捕获数据,数据仓库用于分析数据
- 数据库对增删改实时性要求强,需要存储在线的用户数据。数据仓库一般是历史数据
- 数据库要尽量避冗余,数据仓库的设计上更偏向反范式设计,因为历史数据往往很多。连接查询会大幅度拖慢速度。
SQL基础随记3 范式 键的更多相关文章
- SQL基础随记1 SQL分类 常用函数 ALL ANY EXISTS IN 约束
SQL基础随记1 SQL分类 常用函数 ALL ANY EXISTS IN 约束 其实这里知识不难,只是好久不接触突然被问的话有时还真的一时答不上,自己写一遍胜过盲扫.当然,也有些常读常新的地方会 ...
- SQL基础随记2 视图 存储过程
SQL基础随记2 视图 存储过程 View CREATE/ALTER/DROP VIEW ViewName as SELECT(...) 可以在视图的基础上继续创建视图,即,将之前创建的视图当做表 ...
- (2.10)Mysql之SQL基础——约束及主键重复处理
(2.10)Mysql之SQL基础——约束及主键重复处理 关键词:mysql约束,批量插入数据主键冲突 [1]查看索引: show index from table_name; [2]查看有约束的列: ...
- 《SQL基础教程》+ 《SQL进阶教程》 学习笔记
写在前面:本文主要注重 SQL 的理论.主流覆盖的功能范围及其基本语法/用法.至于详细的 SQL 语法/用法,因为每家 DBMS 都有些许不同,我会在以后专门介绍某款DBMS(例如 PostgreSQ ...
- (2.15)Mysql之SQL基础——开发设计最佳规范
(2.15)Mysql之SQL基础——开发设计最佳规范 关键字:mysql三大范式,mysql sql开发规范 分析: show profile.mysqllsla.mysqldrmpslow.exp ...
- SQL 基础笔记(一)
本笔记整理自<SQL 基础教程>.<MySQL 必知必会>和网上资料.个人笔记不保证正确. 一.基础 SQL,即结构化查询语言,是为访问与操作关系数据库中的数据而设计的语言. ...
- 信安周报-第02周:SQL基础
信安之路 第02周 Code:https://github.com/lotapp/BaseCode/tree/master/safe 前言 本周需要自行研究学习的任务贴一下: 1.概念(推荐) 数据库 ...
- [SQL] SQL 基础知识梳理(一)- 数据库与 SQL
SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...
- [SQL] SQL 基础知识梳理(三) - 聚合和排序
SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...
随机推荐
- CentOS8.1操作系下使用通用二进制包安装MySQL8.0(实践整理自MySQL官方)
写在前的的话: 在IT技术日新月异的今天,老司机也可能在看似熟悉的道路上翻车,甚至是大型翻车现场!自己一个人开车过去翻个车不可怕,可怕的是带着整个团队甚至是整个公司一起翻车山崖下,解决办法就是:新出现 ...
- Entity Framework Core遇到的问题汇总
1.add-migration : 无法将“add-migration”项识别为 cmdlet.函数.脚本文件或可运行程序的名称.请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次. 使用E ...
- HDU-4341 Gold miner 题解
题目大意 黄金矿工的游戏,不过每个金块可以看做是质点,没有大小,给出每个金块的坐标.抓取所花费的时间(包括返回的时间),以及价值,其中有一些金块可能会共线.求在规定时间内所获得的最大价值. 样例 样例 ...
- TensorFlow从0到1之TensorFlow超参数及其调整(24)
正如你目前所看到的,神经网络的性能非常依赖超参数.因此,了解这些参数如何影响网络变得至关重要. 常见的超参数是学习率.正则化器.正则化系数.隐藏层的维数.初始权重值,甚至选择什么样的优化器优化权重和偏 ...
- Linux下,如何监控某个进程到底向哪个地址发起了网络调用
Linux下,如何监控某个进程到底向哪个地址发起了网络调用 有时候,有些应用,比如idea,你发起某个操作时,其底层会去请求网络,获取一些数据. 但是不知道,请求了什么地址.举个例子,在idea中,m ...
- Machine Learning Note
[Andrew Ng NIPS2016演讲]<Nuts and Bolts of Applying Deep Learning (Andrew Ng) 中文详解:https://mp.weixi ...
- Day8-微信小程序实战-交友小程序-首页用户列表渲染及多账号调试及其点赞功能的实现
在这之前已经把编辑个人的所有信息的功能已经完成了 之后先对首页的列表搞动态的,之前都是写死的静态 1.之前都是把好友写死的,现在就在js里面定义一个数组,用循环来动态的绑定 在onReady中定义,取 ...
- 黎活明8天快速掌握android视频教程--16_采用SharedPreferences保存用户偏好设置参数
SharedPreferences保存的数据是xml格式,也是存在数据保存的下面四种权限: 我们来看看 我们来看看具体的业务操作类: /** * 文件名:SharedPrecences.java * ...
- 尚学堂 216 java中的字节码操作
所谓的字节码操作就是操作我们已经加载的字节码 接下来我们重点来讲解javaassist类库 使用需要下载jar包,把jar包添加到对应的工程之后 package com.bjsxt.test; pub ...
- 深入理解JVM(③)虚拟机的类加载时机
前言 Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称为虚拟机的类加载机制. 类加载的时机 一个类型 ...