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 在其他常用表中“冗余",这样可以只进行单表扫描。而不用在大数据量的情况下再连接查询。

反范式在OLAP场景比较常用,详见此处另见此处

 

 

反范式设计与数据仓库

数据仓库与数据库的区别:

  • 数据库用于捕获数据,数据仓库用于分析数据
  • 数据库对增删改实时性要求强,需要存储在线的用户数据。数据仓库一般是历史数据
  • 数据库要尽量避冗余,数据仓库的设计上更偏向反范式设计,因为历史数据往往很多。连接查询会大幅度拖慢速度。

 

SQL基础随记3 范式 键的更多相关文章

  1. SQL基础随记1 SQL分类 常用函数 ALL ANY EXISTS IN 约束

    SQL基础随记1 SQL分类 常用函数 ALL ANY EXISTS IN 约束   其实这里知识不难,只是好久不接触突然被问的话有时还真的一时答不上,自己写一遍胜过盲扫.当然,也有些常读常新的地方会 ...

  2. SQL基础随记2 视图 存储过程

    SQL基础随记2 视图 存储过程   View CREATE/ALTER/DROP VIEW ViewName as SELECT(...) 可以在视图的基础上继续创建视图,即,将之前创建的视图当做表 ...

  3. (2.10)Mysql之SQL基础——约束及主键重复处理

    (2.10)Mysql之SQL基础——约束及主键重复处理 关键词:mysql约束,批量插入数据主键冲突 [1]查看索引: show index from table_name; [2]查看有约束的列: ...

  4. 《SQL基础教程》+ 《SQL进阶教程》 学习笔记

    写在前面:本文主要注重 SQL 的理论.主流覆盖的功能范围及其基本语法/用法.至于详细的 SQL 语法/用法,因为每家 DBMS 都有些许不同,我会在以后专门介绍某款DBMS(例如 PostgreSQ ...

  5. (2.15)Mysql之SQL基础——开发设计最佳规范

    (2.15)Mysql之SQL基础——开发设计最佳规范 关键字:mysql三大范式,mysql sql开发规范 分析: show profile.mysqllsla.mysqldrmpslow.exp ...

  6. SQL 基础笔记(一)

    本笔记整理自<SQL 基础教程>.<MySQL 必知必会>和网上资料.个人笔记不保证正确. 一.基础 SQL,即结构化查询语言,是为访问与操作关系数据库中的数据而设计的语言. ...

  7. 信安周报-第02周:SQL基础

    信安之路 第02周 Code:https://github.com/lotapp/BaseCode/tree/master/safe 前言 本周需要自行研究学习的任务贴一下: 1.概念(推荐) 数据库 ...

  8. [SQL] SQL 基础知识梳理(一)- 数据库与 SQL

    SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...

  9. [SQL] SQL 基础知识梳理(三) - 聚合和排序

    SQL 基础知识梳理(三) - 聚合和排序 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5926689.html 序 这是<SQL 基础知识梳理 ...

随机推荐

  1. java实现第六届蓝桥杯九数分三组

    九数分三组 题目描述 1~9的数字可以组成3个3位数,设为:A,B,C, 现在要求满足如下关系: B = 2 * A C = 3 * A 请你写出A的所有可能答案,数字间用空格分开,数字按升序排列. ...

  2. Linux 源码包服务的管理

    源码包安装服务的启动 使用绝对路径,调用启动脚本来启动.不同源码包的启动脚本不同,可以查看源码包的安装说明,查看启动脚本的方法 /usr/local/apache2/bin/apachectl sta ...

  3. $.ajax 中的contentType 坑坑

    $.ajax 设置数据类型 applicaiton/json之后,服务器端(express)就拿不到数据. $.ajax 中的 contentType 和 dataType: contentType ...

  4. ThreadLocal的使用场景分析

    目录 一.ThreadLocal介绍 二.使用场景1——数据库事务问题 2.1 问题背景 2.2 方案1-修改接口传参 2.3 方案2-使用ThreadLocal 三.使用场景2——日志追踪问题 四. ...

  5. String Problem(模板)【最短路】

    String Problem 题目链接(点击) Boy Valera likes strings. And even more he likes them, when they are identic ...

  6. 【JMeter_20】JMeter逻辑控制器__事务控制器<Transaction Controller>

    事务控制器<Transaction Controller> 业务逻辑: 这个控制器在在业务控制上并没有什么特殊逻辑,可以理解为在简单控制器的基础上添加了统计的功能,当所有子节点全部成功则成 ...

  7. Spring Boot 2 实战:利用Redis的Geo功能实现查找附近的位置

    1. 前言 老板突然要上线一个需求,获取当前位置方圆一公里的业务代理点.明天上线!当接到这个需求的时候我差点吐血,这时间也太紧张了.赶紧去查相关的技术选型.经过一番折腾,终于在晚上十点完成了这个需求. ...

  8. OS_页面置换算法:C++实现

    一.实验目的: 通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种页面置换算法的基本思想和实现过程,并比较它们的效率. 二.实验内容: 本实 ...

  9. Beta冲刺<2/10>

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta冲刺 这个作业的目标 Beta冲刺--第二天(05.20) 作业正文 如下 其他参考文献 ... B ...

  10. Beta冲刺--冲刺总结

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 Beta 冲刺 这个作业的目标 Beta冲刺--冲刺总结 作业正文 如下 其他参考文献 ... Beta冲刺 ...