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

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

数据库规范化,又称数据库或资料库的正规化、标准化,是数据库设计中的一系列原理和技术,以减少数据库中数据冗余,增进数据的一致性。关系模型的发明者埃德加·科德最早提出这一概念,并于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

  

      

数据库 SQL :数据库三大泛式简谈的更多相关文章

  1. 数据库SQL优化大总结之 百万级数据库优化方案(转载)

    网上关于SQL优化的教程很多,但是比较杂乱.近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充. 这篇文章我花费了大量的时间查找资料.修改.排版,希望大家阅读之后,感觉 ...

  2. 数据库sql优化总结之5--数据库SQL优化大总结

    数据库SQL优化大总结 小编最近几天一直未出新技术点,是因为小编在忙着总结整理数据库的一些优化方案,特此奉上,优化总结较多,建议分段去消化,一口吃不成pang(胖)纸 一.百万级数据库优化方案 1.对 ...

  3. 数据库—SQL语句

    下列语句部分是Mssql语句,不可以在access中使用. SQL分类:   DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)   DML—数据操纵语言(SELECT,DEL ...

  4. Azure SQL 数据库:服务级别与性能问答

    ShawnBice    2014 年 5 月 5 日上午 10:00 几天前,我发表了一篇文章,并就 4 月 24 日发布的适用于Windows Azure SQL 数据库的新服务级别提供了一些预料 ...

  5. C# 连接SQL数据库 常用连接字符串

    一:C# 连接SQL数据库 Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myP ...

  6. 使用SQL Server 2008远程链接时SQL数据库不成功的解决方法

    关键设置: 第一步(SQL2005.SQL2008): 开始-->程序-->Microsoft SQL Server 2008(或2005)-->配置工具-->SQL Serv ...

  7. Windows下Postgre SQL数据库通过Slony-I 实现数据库双机同步备份

    一. 我们要实现的环境是windows xp.windows2003上安装Postgre SQL数据库,实现目的是两台数据库服务器进行数据库同步,即数据库同步更新.删除.插入等对数据库的操作. 二. ...

  8. C# 连接SQL数据库

    感觉很有必要总结一下 一:C# 连接SQL数据库 Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;P ...

  9. SQL数据库修复/数据库置疑修复

    SQL数据库修复的三大核心技术: 1.磁盘阵列分析重组技术: 2.数据库恢复与修复技术: 3.SCSI盘物理故障开盘技术. 至今已经成功恢复数百台服务器的SQL数据库,用户覆盖全国. 导致SQL数据库 ...

随机推荐

  1. 【转】RTSP实例解析

    原文网址:http://www.cnblogs.com/qq78292959/archive/2010/08/12/2077039.html. 核心提示:rtsp简介(ZT) Real Time St ...

  2. HttpWebRequest代理访问网站

    private void button1_Click(object sender, EventArgs e) { string str ="http://www.7y8.com/V/ip.a ...

  3. java web项目导入问题

    由于工作问题,接触到很多其他人的项目,有时候想要直接跑起来,还是需要一定的耐力. 1:导入不进去,干脆新建项目,一个个复制进去: 2:第三方jar包不要忘记,核实jdk    j2ee的版本,编译路径 ...

  4. 嵌入式 uboot引导kernel,kernel引导fs

    1.uboot引导kernel: u-boot中有个bootm命令,它可以引导内存中的应用程序映像(Kernel),bootm命令对应 common/cmd_bootm.c中的do_bootm()函数 ...

  5. Bootstrap学习笔记上(带源码)

    阅读目录 排版 表单 网格系统 菜单.按钮 做好笔记方便日后查阅o(╯□╰)o bootstrap简介: ☑  简单灵活可用于架构流行的用户界面和交互接口的html.css.javascript工具集 ...

  6. cocoa中获取时间

    头文件#import "Foundation/NSCalendarDate.h" + (id)calendarDate; - (int)yearOfCommonEra;- (int ...

  7. ansible中文手册-基础模块使用

    此篇文章主要是翻译ansible官网文档而来,在里面讲述了如何使用ansible的基础模块,总体感觉比较晦涩,但是后面会写出自己相关实践的文档,从而更加通俗易懂,官网的东西拿来当手册偶尔翻翻也是很不错 ...

  8. 提供给开发者 10 款最好的 Python IDE

    Python 非常易学,强大的编程语言.Python 包括高效高级的数据结构,提供简单且高效的面向对象编程. Python 的学习过程少不了 IDE 或者代码编辑器,或者集成的开发编辑器(IDE).这 ...

  9. 【加解密】关于DES加密算法的JAVA加密代码及C#解密代码

    JAVA加密: package webdomain; import java.security.Key; import java.security.spec.AlgorithmParameterSpe ...

  10. shell语句记录-awk

    cat ./daily_uv/daily_uv_20140104 | awk '{fr[$1]+=$3; k=$1 "_" $2; av[k]+=$3;} END{for (k i ...