数据库设计三大范式

数据库设计三大范式

为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。

                 

在实际开发中最为常见的设计范式有三个:

1.第一范式(确保每列保持原子性)

第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。

第一范式的合理遵循需要根据系统的实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库的第一范式,如下表所示。

上表所示的用户信息遵循了第一范式的要求,这样在对用户使用城市进行分类的时候就非常方便,也提高了数据库的性能。

                

2.第二范式(确保表中的每列都和主键相关)

第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键,如下表所示。

 订单信息表

这样就产生一个问题:这个表中是以订单编号和商品编号作为联合主键。这样在该表中商品名称、单位、商品价格等信息不与该表的主键相关,而仅仅是与商品编号相关。所以在这里违反了第二范式的设计原则。

而如果把这个订单信息表进行拆分,把商品信息分离到另一个表中,把订单项目表也分离到另一个表中,就非常完美了。如下所示。

这样设计,在很大程度上减小了数据库的冗余。如果要获取订单的商品信息,使用商品编号到商品信息表中查询即可。

                 

3.第三范式(确保每列都和主键列直接相关,而不是间接相关)

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。

比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。如下面这两个表所示的设计就是一个满足第三范式的数据库表。

这样在查询订单信息的时候,就可以使用客户编号来引用客户信息表中的记录,也不必在订单信息表中多次输入客户信息的内容,减小了数据冗余。

             

    

转载于:https://www.cnblogs.com/HiJacky/p/5499412.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在各个PC端应用使用表情的快捷键,王大妈都开始用这个表情啦

很多人像在文章或者聊天使用表情,但是不知道如何输入,下面孙叫兽就来带你体验一下吧 快捷键 win. 比如在微信聊天框使用win. 就可以输入表情符号,颜文字及符号。 你们学废了?

扩展Java EE应用程序的基础

老实说,“可扩展性”是一个详尽的主题,并且通常没有被很好地理解。 通常,它被假定与高可用性相同。 我已经看到新手程序员和“经验丰富”的建筑师都建议将“ 集群 ”作为可伸缩性和HA的解决方案。 它实际上没有任何问题,但是问题在…

史上最全wireshark使用教程,8万字整理总结,建议先收藏再耐心研读

目录 第 1 章 介绍... 1 1.1. 什么是Wireshark. 1 1.1.1. 主要应用... 1

小白自学前端,轻松月入过万哦!

第一、 前端的入门操作 首先是要熟悉前端的基础操作。 前端的基础:JavaScript,HTML,CSS,然后可以深入学习jQuery。 如果你是想 1.专攻网页,那你就学习HTML。 2.专攻层叠样式表,就学习CSS,它可以…

netbeans代码提示_Java代码现代化的七个NetBeans提示

netbeans代码提示在“ 七个不可或缺的NetBeans Java提示”一文中 ,我谈到了一般使用NetBeans提示的问题,然后重点介绍了七个提示。 接下来列出了该帖子中强调的七个提示: 可疑方法调用 使用或! AND字符串构造函数比较字符串 构造…

史上最全SVN使用总结,建议先收藏后观看

最近在公司又开始玩SVN啦,这里给大家总结一下,基本上在公司不是用git就是用SVN进行代码管理,作为程序员,这些工具的使用还是需要熟悉了解一下的,本期孙叫兽给大家分享一下SVN相关的知识点,做到会用即可。不…

JS常用正则表达式

感谢水之原的整理,比较全得正则表达式 整数或者小数:^[0-9]\.{0,1}[0-9]{0,2}$只能输入数字:"^[0-9]*$"。只能输入n位的数字:"^\d{n}$"。只能输入至少n位的数字:"^\d{n,}$"。只能输入m~…

14万字面试题汇总整理,祝你顺利斩获大厂前端offer

导读:最近很多小伙伴私信我说,一般大厂的前端面试题都有哪些,应该如何准备,要不要刷题等等,这里孙叫兽简单给大家总结一下前端的高频面试题,如果对你有帮助,记得点赞评论收藏。现在很多大厂都比…

又见链表 --- 另一种Creat方式与反转

链表 作为一种数据结构,链表以其方便的增删查改功能,实现了无数经典有用的程序。 在之前的帖子里,我构建链表的方式是建立一个不储存数据的head节点,然后通过一边输入数据一边建立结点的方式构建整个链表。 与之前不同的是&#x…

现在抖音这么火,那么你知道如何用CSS实现抖音字体?

比如这种抖音字体是不是感觉很酷,它是如何实现的呢,下面孙叫兽就简单分享一下CSS的实现方法,记得点赞收藏。 老司机给大家的一些小建议,一定要敲代码敲代码敲代码(重要的事情说三遍),程序员是实战家,不是思想家和理论家,程序员都是工兵,这个排雷的经验很重要。 实现这…

史上最全关于苹果开发者账号及上架APPStore总结

很多人如果开发这种移动应用APP,上架到到APPStore难免会遇到一系列的问题,这里孙叫兽进行总结一下,如果本文对你有帮助,记得转发点赞收藏。 一: 开发者账号的介绍 1 个人开发者账号 申请费用: 99美元/年 介绍:一般由iOS开发者个人申请,上架开发者自己的APP作品到苹果商…

EK算法应用,构图(POJ1149)

题目链接:http://poj.org/problem?id1149 题意中有一点要注意,否则构图就会有问题,每个顾客走后,被打开过的那些猪圈中的猪都可以被任意的调换到其他开着的猪圈中。 这里的构图不是单一的相邻,以及容量了,…

平台代码检查工具:sonarLint+sonarqube安装教程

加强对代码质量的管控要求,不允许新增代码部分出现严重、重要、主要等sonar扫描问题。 大家按以下文档安装开发工具对应的代码检测插件,请大家务必重视、执行.这里只介绍前端开发VSCode,后端开发Eclipse,两种代表性的编译器安装sonarLintsonarqube方法,其…

程序员通过CSDN如何获取收益

大家好,我是孙叫兽 ,本期内容给大家分享如何使用CSDN一边学习,一遍赚取收益,这样学习的时候也会产生动力. 废话不多说,直接看近7天收益. 博主如何赚取收益 对于博主这些创作者来说,收益主要有付费专栏,VIP文章收益,活动收益,红包收益,问答收益,打赏收益,付费资源收益,下载VIP分…

《Windows驱动开发技术详解》之编程加载NT式驱动

之前我们加载驱动都是利用INSTDRV这个应用,其原理是在注册表中写入相应的字段,这一节我们手动编写代码去加载驱动,其原理类似: 设备驱动程序的动态加载主要由服务控制管理程序(Service Control Manager,SCM&#xff09…

程序员如何快速成长为IT精英

很多程序员工作了很多年,仍然只学到了皮毛点的业务和技术,技术长时间没有提升,一直拖拖拉拉处于某个水平,没有接触到核心业务,也难于成为公司的中流砥柱和骨干。那么程序员该如何成长呢? 1.主动学习 时刻保持危机感,对知识保持好奇心,完善自己的职业规划和知识体系,掌…

JavaFX实际应用程序:AISO HRC-Matic

“ Real-World JavaFX Apps”系列中的第三个应用程序是一种重型数据输入应用程序,由称为HRC-Matic的关系数据库支持。 它是由AISO在日内瓦开发的。 AISO是一家专门开发基于JavaFX的业务应用程序的公司。 他们还在研究我在本系列的第一个博客( 欧洲广播联…

Feather包实现数据框快速读写,你值得拥有

什么是Feather? Feature是一种文件格式,支持R语言和Python的交互式存储,速度更快。目前支持R语言的data.frame和Python pandas 的DataFrame。 Feather收到了Apache arrow 项目的支持,Apache Arrow是Apache基金会下一个全新的开源项…

一文教你学会需求分析与管理

大家好,我是孙叫兽,本期给大家分享需求分析与管理,在项目开始或者需求整理时,这方面的知识显得尤为重要,常言道:良好的开始是成功的一半! 1.需求的定义 产品需求是在一定的时期,一定的场景中,无论是心理上还是生理上的,用户有着某种“需要”,这种“需要”用户自己不…

java 编写代码_Java 7:如何编写非常快速的Java代码

java 编写代码当我第一次写此博客时,我的目的是向您介绍ThreadLocalRandom类,它是Java 7中新增的用于生成随机数的类。 我在一系列微基准测试中分析了ThreadLocalRandom的性能,以了解其在单线程环境中的性能。 结果相对令人惊讶:尽…