zoukankan      html  css  js  c++  java
  • 数据库(一),范式

    范式

    为什么要用范式

    我们在学习关系型数据库的时候一定有感觉,关系数据库不就是一个二维表格吗,那么数据库有什么用?

    数据库看上去像一个表格,其实不然,比如如下的订单表,一个订单号X2001对应一个用户,但是还对应了两行产品,非常不规范。

    image.png

    要想把这个表规范化,可以使用范式。引入范式的主要目的在于:解决冗余的问题

    第一范式

    那么如何规范化呢?可以拆分成两个表格。

    一个是订单表
    image.png

    一个订单号可以唯一的确定一行

    一个是细节表,一个订单号+产品编码才可以唯一的确定一行。

    image.png

    拆分以后就可以保证一个单元格只有一个值了

    所以我们说订单表的主键是 (订单号), 细节表的主键是(订单号,产品编码), 这是一个复合主键

    第二范式

    再看看订单细节表产品名称单价 实际上并不依赖于 订单号
    如果想添加一个新的产品, 你会发现没法放入这张表, 因为没有订单号!

    image.png

    所以还需要再次拆分。

    image.png

    拆分以后,表4.1订单细节表的主键还是(订单号,产品编码),但是剩下的属性(数量)肯定是完全依赖于主键的。

    表4.2产品表也类似,主键是产品编码,剩下的属性都依赖于产品编码

    所有属性都依赖于主键的情况就是第二范式

    第三范式

    我们再回过头来看一下表格3 订单表,它的主键是订单号,所有的属性都依赖于主键,已经是第二范式。 但是我们发现,订单号能决定用户ID,用户ID能决定用户名称,这就出现了依赖传递订单号->用户ID->用户名称

    image.png

    那么可以再拆分

    image.png

    没有传递依赖了, 我们可以称之为 第三范式

    为了满足范式要求,需要把一张大表拆分开,到时候查询岂不是非常麻烦?是的,需要将这些表Join起来,如果数据量大的时候,连接非常耗时。有时我们需要违反范式,做点数据冗余。

    总结

    总结一下:

    • 第一范式:字段是不可再分的,也就是不存在一个字段中存在两个及以上的情况。

    • 第二范式:所有属性都依赖于主键,其他不相关的都拆分出去了。

    • 第三范式:不存在某个列不依赖于非主键的列,没有依赖传递了

    参考

    主要改编自张大胖学数据库

    也可以参见简书主页:https://www.jianshu.com/u/482f183ec380
  • 相关阅读:
    iOS开发系列--让你的应用“动”起来
    iOS开发系列--打造自己的“美图秀秀”
    iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控
    iOS开发系列--视图切换
    iOS开发系列--UITableView全面解析
    iOS开发系列--无限循环的图片浏览器
    SQLServer某个库log日志过大,无法收缩日志文件 ,因为该文件结尾的逻辑日志文件正在使用
    CentOS7下rsync服务端与Windows下cwRsync客户端实现数据同步配置方法
    Windows下cwrsync客户端与rsync群辉存储服务端定时数据同步
    SQL Server字符串函数STUFF的使用
  • 原文地址:https://www.cnblogs.com/dy2903/p/8365374.html
Copyright © 2011-2022 走看看