数据库范式

本贴最后更新于 2360 天前,其中的信息可能已经时移世易

一、数据库范式的目标及弊端
1、目标
(1)消除插入异常(Insert Anomaly)
插入异常:由于没有某些属性信息,而该属性又不能为 null,导致无法插入。

(2)消除删除异常(Delete Anomaly)
删除异常:只想删除一条信息却连带的删除了其他信息。

(3)消除更新异常(Update Anomaly)
更新异常:更新一条记录却连带的需要更新其他多条记录。

(4)减少数据冗余(Redundancy)
避免同一信息在表中存储多次。
以上三个异常都是由于数据冗余造成的。

2、弊端
应用的范式等级越高,则表越多。
查询时要连接多个表,增加了查询的复杂度。
查询时需要连接多个表,降低了数据库查询性能。
而现在的情况,磁盘空间成本基本可以忽略不计,所以数据冗余所造成的问题也并不是应用数据库范式的理由。

(1)反规范化
①、增加冗余列或派生列。
②、表的合并和分割。

二、函数依赖
函数依赖是属性间的约束关系。
一张表中,在属性(或属性组)X 的值确定的情况下,必定能确定属性 Y 的值,那么就可以说 Y 函数依赖于 X,写作 X → Y。

(1)平凡函数依赖和非平凡函数依赖
①、平凡函数依赖
X → Y 且 Y 属于 X。
②、平凡函数依赖
X → Y 且 Y 不属于 X。

(2)完全函数依赖和部分函数依赖
①、完全函数依赖
X、Y 是表的属性或属性组,若 X → Y,且对于 X 的任何一个真子集(假如属性组 X 包含超过一个属性的话),X → Y 不成立,那么我们称 Y 完全函数依赖于 X 。
②、部分函数依赖
X、Y 是表的属性或属性组,若 X → Y,且存在 X 的一个真子集(假如属性组 X 包含超过一个属性的话),X → Y 成立,那么我们称 Y 部分函数依赖于 X 。

(3)传递函数依赖和非函数传递依赖
①、传递函数依赖
X → Y,Y → Z,且 Y 不包含于 X,X 不函数依赖于 Y,则 Z 传递函数依赖于 X。
②、非函数传递依赖
X → Y,Y → Z,且 Y 不包含于 X,X 不函数依赖于 Y,则 Z 传递函数依赖于 X,否则称 Z 非传递函数依赖于 X。

三、多值依赖
多值依赖是元组值之间的约束关系。
在关系 R 中,如果有 X+Y+Z=U,对于任意的,都有 Y 与之对应,且 Y 只与 X 的值有关,与 Z 无关,就称 R 为多值依赖.也就是说对于任意的<X, Yi>,<X, Yj> 都对应一个 y。就是一对多,整张表就是多对多。
任一元组( 课程, 授课对象) 都有一组教师与之对应, 而这组教师仅取决于课程。
就是一个 X 值对应一组 Y 值,X →→ Y。

(1)平凡多值依赖和非平凡多值依赖
①、平凡多值依赖
设 X、 Y 是关系 R(U)的属性, U=X+Y。如果 X →→ Y,则称为平凡多值依赖。
②、非平凡多值依赖
设 X、 Y、 Z 是关系 R(U)的属性, U=X+Y+Z。如果 X →→ Y,则称为非平凡多值依赖。

四、范式
(1)第一范式(1NF,First Normal Form)
不存在复合属性(一个属性由多个子属性复合而成)及多值属性(一个属性的一条记录包含多个值),只存在单值属性。

仍然存在四个问题。

(2)第二范式(2NF,Second Normal Form)
1、满足 1NF;
2、不存在非主属性对任一候选键的部分函数依赖。

插入异常和数据冗余问题有改进,但仍存在,仍存在删除异常和更新异常。

模式分解:

(3)第三范式(3NF,Third Normal Form)
1、满足 2NF;
2、不存在非主属性对任一候选键的传递函数依赖。

四个问题都有改进,但仍存在。

(4)Boyce-Codd 范式(BCNF,Boyce-Codd normal form)
1、满足 3NF;
2、不存在主属性对任一候选键的部分函数依赖与传递函数依赖。

(5)第四范式(4NF,Fourth Normal Form)
1、满足 BCNF;
2、不存在非平凡多值依赖。

就是去掉多对多关系。

参考:
https://www.zhihu.com/question/24696366
http://www.cnblogs.com/CareySon/archive/2010/02/16/1668803.html
http://www.cnblogs.com/waj6511988/p/7027127.html

  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    675 引用 • 535 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 56 关注
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    533 引用 • 3528 回帖
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 624 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 424 关注
  • 分享

    有什么新发现就分享给大家吧!

    242 引用 • 1748 回帖 • 1 关注
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 597 关注
  • 招聘

    哪里都缺人,哪里都不缺人。

    189 引用 • 1056 回帖
  • sts
    2 引用 • 2 回帖 • 148 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 125 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    51 引用 • 226 回帖 • 1 关注
  • V2Ray
    1 引用 • 15 回帖 • 1 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    4 引用 • 16 回帖 • 1 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 71 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖 • 1 关注
  • Hibernate

    Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操纵数据库。

    39 引用 • 103 回帖 • 684 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    16 引用 • 53 回帖 • 123 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    284 引用 • 4481 回帖 • 655 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1083 引用 • 3461 回帖 • 285 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    9 引用 • 32 回帖 • 165 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 619 关注
  • WebSocket

    WebSocket 是 HTML5 中定义的一种新协议,它实现了浏览器与服务器之间的全双工通信(full-duplex)。

    48 引用 • 206 回帖 • 398 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    330 引用 • 614 回帖
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 228 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 404 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    138 引用 • 268 回帖 • 194 关注