相信,在学习数据库知识时,大家都会碰到这个概念问题:数据三大泛式,同时,在面试过程中,可能大部分面试官也会提及这个问题。

首先,看看维基百科对于三大泛式的定义:

数据库规范化,又称数据库或资料库的正规化、标准化,是数据库设计中的一系列原理和技术,以减少数据库中数据冗余,增进数据的一致性。关系模型的发明者埃德加·科德最早提出这一概念,并于1970年代初定义了第一范式、第二范式和第三范式的概念,还与Raymond F. Boyce于1974年共同定义了第三范式的改进范式——BC范式。

除外还包括针对多值依赖的第四范式,连接依赖的第五范式,DK范式和第六范式

下面,就不扯太多定义,谈谈本人,从网上及博客园博文中所理解到的三大泛式。关于三大泛式的定义,在之前有关一篇博文的评论中,我觉得总结的相当好。

       一 属性的原子性

       二 主键列与非主键列存在完全依赖关系

       三 非主键列间不存在函数依赖关系

       接下来,再来具体介绍介绍三大泛式内容。

       A 属性的原子性

        简而言之,即数据库表中每一列的值已为不可再进行分割最小单位。感觉这么一讲,还是 TMD 有点没扯太清。打个简单比方,比如:在电商网站中,存储用户收货地址信息(省市县信息),在数据库表中,当然可以设置为一个字段,即可存储省市县全部地址字符串信息。但是,需要想清楚一个问题,数据库表设计始终要为代码设计,因此,如果在后续过程中,需要单独用到省、市字段信息,此时,如若还采取单个字段存储省市信息。那么,显示易见,即破坏了第一泛式设计。

B 主键列与非主键列存在完全依赖关系

在数据库表设计中,相信,大部分表设计,用户都会设置主键,以便作为唯一标识,便于增删查改中的删查改之用。而第二泛式提及的主键与非主键必须存在完全依赖关系,即严格表明了一点,为了减少冗余,必须每一个非主键与主键列必须完全依整,否则,将破坏第二泛式

查看下表,其中为货品表,包括货品_ID、货品_Type、货品_Name、货品_Notice 四字段,货品_ID + 货品_Type 组成联合主键,货品_Notice 明显即即不完全依赖货品_ID 字段,而仅仅依赖货品_Type 字段。

非主键列间不存在函数依赖关系

         前面提到过,在数据库中,一般表设计,将包括唯一的主键标识以及非主键列,那么,在第二泛式中提到过,主键与非主键列必须存在完全依赖关系。而第三泛式中,明确表明,非主键列不能存在函数依整关系,不然,将会破坏第三泛式。

          同样,以上一个表设计为例,字段依旧分别为:货品_ID、货品_Type、货品_Name、货品_Notice 四字段,货品_ID为主键(注意此处区别),此时,会发现该表设计的问题,货品_Notice 与货物_Type 存在依赖关系,不符合设计要求。

       

          个人感想

          相信,很多刚出来工作的同学,进入公司时候,在见到公司数据库表设计时,就会严格按照以上提及的三大泛式,讲公司表设计不规泛,没有外键之类。但是,有时候要明白一点,设计归设计,数据库表设计始终于归于一点,最后为代码服务。

          所以,我们会看到种种设计,为了避免频繁连表查询,会在表中增加冗余字段,为了便于序列化,会在单个字段中存储 JSON 字符串或者 XML 信息。

          

         

参考资料:http://www.cnblogs.com/wuguanglei/p/4224893.html

https://zh.wikipedia.org/zh/%E6%95%B0%E6%8D%AE%E5%BA%93%E8%A7%84%E8%8C%83%E5%8C%96

  

      

转载于:https://www.cnblogs.com/Lumia1020/p/5454886.html

数据库 SQL :数据库三大泛式简谈相关推荐

  1. 数据库设计3个泛式和经验谈

    要牢记3个泛式,我把3NF缩写让大家容易记忆: 1,原子性(数据是不可以拆分的,比如1,2,3这样的就违背了1NF) 2,关联性(所有字段必须和主键关联) 3,非关联性(除主键关联外,其他字段之间不互 ...

  2. win2003服务器中:无法连接ACCESS数据库/sql数据库正常 .net程序生成的dll文件拒绝访问问题...

    早上一来公司发现一客户网站爆出类似于这个错误提示:  //编译器错误信息: CS0016: 未能写入输出文件,..\Temporary ASP.NET Files\WebApp\d087da43\c1 ...

  3. sql 获取数据库字段信息_使用DBATools获取SQL数据库详细信息

    sql 获取数据库字段信息 In the series of articles on DBATools, (see TOC at the bottom) we are exploring useful ...

  4. azure云数据库_如何使用SQL Data Sync同步Azure SQL数据库和本地数据库

    azure云数据库 SQL Data Sync allows you to synchronize data across multiple Azure SQL databases and on-pr ...

  5. 阿里P8架构师谈:Web前端、应用服务器、数据库SQL等性能优化总结

    web前端性能优化 Web前端指网站业务逻辑之前的部分,包括: 1.浏览器加载 2.网站视图模型 3.图片服务 4.CDN服务等 主要优化手段有优化浏览器访问,使用反向代理,CDN等. 1.浏览器访问 ...

  6. Java各类技能知识点学习链接大全:四、数据库Sql,Mysql相关

    以下内容大多是学习链接,他人整理,个人收藏以便复习,同时归纳分享出来(如有不妥,原作者可随时联系本人删除,感谢!) 四.数据库Sql,Mysql相关 1.MySQL中锁详解(行锁.表锁.页锁.悲观锁. ...

  7. 1.0 java_Mybatis_oracle基于WEB的仓库管理系统的设计与实现(源码+数据库sql+论文+视频齐全)----库管理系统---源码在底部

    基于Web的仓库管理系统的设计与实现 摘 要 仓库物品的管理是与我们的日常生活息息相关的一个重大问题.随着我国经济飞速的发展,改革开放的不断深入,企业要想在激烈的市场竞争中立于不败之地,要想继续的发展 ...

  8. Mysql数据库与数据库三大范式

    作者:左新宇 链接:https://zhuanlan.zhihu.com/p/59394493 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. MySQL 常用命令 ...

  9. 数据库SQL优化大总结

    (一)索引的作用 索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,5秒以上就已经 ...

最新文章

  1. PaintCode 教程1:动态绘制按钮
  2. python 常用包_Python常用指引
  3. 【Python CheckiO 题解】Create Intervals
  4. MaterialDesignInXAML WPF入门教程 目录
  5. matlab2017调用vgg19,从VGG19的任意中间层中抽取特征
  6. java处理代码表_Java处理中华人民共和国行政区划代码
  7. win10浏览器闪退_win10系统打开ie11浏览器出现闪退的两种解决方法
  8. c语言编程学习入门指南
  9. led灯光衰怎么解决_led灯光衰一般多少为正常?
  10. Android集成Bmob后端云
  11. kettle脚本Linux执行,kettle在linux下面用于shell脚本执行:转换或者作业
  12. 六、总线(一)总线概述
  13. 我在北大青鸟的工作经历
  14. MIT Molecular Biology 笔记6 转录的调控
  15. 成都计算机专科学院分数线,成都计算机工业职业技术学校2019年招生录取分数...
  16. 可怕!只因写了一段爬虫代码,全公司200人被警察一锅端!
  17. 使用AJAX的10个商业动机 {转}
  18. Python----空空如也
  19. Java获取CPU占用率
  20. Meta开源JavaScript内存泄漏监测工具MemLab

热门文章

  1. 送 10 本签名书!
  2. 计算机学报和c类会议,ccf期刊目录_ccf_ccf a类
  3. 微信公众号音乐html,如何在微信公众号文章内插入音频及样式?
  4. Feign原理:current list of Servers哪里来的
  5. LeetCode刷题|36有效的数独
  6. ps如何把自己的图与样机结合_Ps如何套用样机图?
  7. 微信带参二维码数据解析
  8. PythonStock(37)股票系统:Python股票系统发布V2.0版本,改个名字吧,叫Python全栈股票系统2.0,可以实现数据的抓取(akshare),统计分析,数据报表展示。
  9. 团队作业四-WBS练习
  10. 计算机突然无法连接网络,win7电脑突然不能上网的四种解决方案