mysql数据库的三范式的设计与理解

一般的数据库设计都需要满足三范式,这是最基本的要求的,最高达到6NF,但是一般情况下3NF达到了就可以

一:1NF一范式的理解:

1NF是关系型数据库中的最基本要求,就是要求记录的属性是原子性,不可分,就是属性不能分,这是关系型数据库的基本要求,不满足这个就不能叫关系型数据库了

例如:

讲师 性别 班级 教室 代课时间 代课时间(开始,结束)
韩忠康 Male php0331 102 30天 2013-03-31,2013-05-05
韩忠康 Male php0228 106 30天 2013-02-28,2013-03-30
韩顺平 male Php0228 106 15天 2013-03-31,2013-05-05

上面的代课时间字段设计就不满足原子性,因为它可以再分的,开始时间和结束时间,需要按照下面来设计拆分:

讲师 性别 班级 教室 代课时间 开始 结束
韩忠康 Male php0331 102 30天 2013-03-31 2013-05-05
韩忠康 Male php0228 106 30天 2013-02-28 2013-03-30
韩顺平 male Php0228 106 15天 2013-03-31 2013-04-20

上面的就满足了,但是有些时候也需要去违背这个1NF的设计:在用dede设计cms的时候后台的下载地址是将格式,名称,分辨率这些进行评级在一个属性里面,但是可以看作一个整体,因为这个属性即使分开,那么各个成员的关系不是平等的,但是代课时间是不一样的,比如分为开始时间和结束时间,两个成员的关系基本一样!所以也不矛盾!

二:2NF二范式的理解

2NF是不能有部分依赖,部分依赖的前提条件是有组合主键,就是每条记录是需要一个主键的,这个主键可以是一个单独的属性,但也可以是组合主键,就是由记录的多个属性来唯一确定一条记录,那么只要出现了组合主键就可以产生部分依赖,部分依赖是组合主键出现的前提下,剩余的属性,不完全依赖于组合主键,也是部分依赖组合主键,比如该表的N条记录中由组合主键中的一条或者几条就可以确定剩余属性的属性,那么就可以说产生部分依赖,而在实际开发中,一般不采用组合主键,而是自己增加一个字段id自增长,作为主键,这样的单属性主键是不会产生部分依赖的!

例如:

讲师P 性别 班级P         教室 代课时间 开始 结束
韩忠康 Male php0331 102 30天 2013-03-31 2013-05-05
韩忠康 Male php0228 106 30天 2013-02-28 2013-03-30
韩顺平 male Php0228 106 15天 2013-03-31 2013-04-20

上面的设计可以用讲师P,班级,两个字段作为组合主键,但是问题来了,那么后面的教室仅仅由班级字段(组合主键中的一条)就可以确定,即所谓教室部分依赖于组合主键,那么就不符合2NF

应该按照下面就行设计:

IDP 讲师 性别 班级 教室 代课时间 开始 结束
1 韩忠康 Male php0331 102 30天 2013-03-31 2013-05-05
2 韩忠康 Male php0228 106 30天 2013-02-28 2013-03-30

可以看到仅仅增加一个主键IDP就不存在部分依赖了,这是实际项目中开发中常用的手段!

三:3NF的理解:不能出现传递依赖:就是主键,非主键1,非主键2三者之间不能出现传递依赖关系,如果出现由主键可以推出非主键1,然后由非主键1可以推出非主键2,那么主键与非主键2就产生了传递依赖关系,这就不满足三范式,通俗来讲,在一个表的,当然以一条记录为单位,主键和非主键之间可以产生父子关系,但是非主键之间是不能出现父子关系的!

例如:

IDP 讲师 性别 班级 教室 代课时间 开始 结束
1 韩忠康 Male php0331 102 30天 2013-03-31 2013-05-05
2 韩忠康 Male php0228 106 30天 2013-02-28 2013-03-30
3 韩顺平 male php0228 106 15天 2013-03-31 2013-04-20

上面的设计不满足3NF:

主键1--推出--->班级php0331,班级php0331-----推出---->教室102,这样给人的感觉,教室不是由主键IDP1直接推出的,好像由班级通过传递推出的;当然还存在

主键IDP---->讲师------>性别

这样的坏处就是会产生数据冗余,解决方案是把中间的代理抽出来作为另外一张表:

应该如下设计:

IDP 讲师 班级 代课时间 开始 结束
1 韩忠康 php0331 30天 2013-03-31 2013-05-05|
2 韩忠康 php0228 30天 2013-02-28 2013-03-30|
3 韩顺平 php0228 15天 2013-03-31 2013-04-20|

--------------------------------------------------------

讲师 性别
韩忠康 male
韩顺平 male

-----------------

班级 教室

php0228 106

php0331 102

-------------

可以看到这样设计只需要用22个字段,而上面那种设计需要用24个字段,这样就节省了2个字段,如果数据是海量的那么节省的数据应该更加多

这样设计,其实为了避免非笛卡尔积数据的重复,当然,笛卡尔积的数据的重复是必须的!

那么数据库的设计可以先按照自己的想法设计一个"大表"出来,然后进行拆分成符合三范式的表,当然一般的规律的实体都单独作为一个表格

比如讲师实体,班级实体,代课关系实体,但是最大的问题是开始不知道哪些是实体,其实除了看得见的,其实说的清的可以描述的关系也可以作为一个实体

,这一点是容易被忽视的,但是随着经验的提升,慢慢会了解!

时间: 2024-12-21 06:02:35

mysql数据库的三范式的设计与理解的相关文章

liunx下mysql数据库使用之三范式,关系模型设计注意项,安装目录结构

数据库的三范式第一范式===>每行记录的属性,是原子的,拆到不可拆为止.===>例如:一个人的籍贯,可以拆分为,省,市,县,乡,村 第二范式===>每行记录的非主属性(非主键属性),都完全依赖主属性(主键).===>每行的数据都能唯一区分.===>例如:一个学校的教师,他的姓名,年龄,性别,籍贯.都依赖它的教师编号===>而它教授的科目,并不依赖他的编号,则需要另建表,作为关系模型,进行存储 第三范式===>在实体关系中,如果不存在非关键字段对任一候选关键字段的函

设计数据库的三范式

在真正开发的时候实际需要用的是反三范式:按照三范式设计好后,在根据查询方便与速度结合在对表增加一些冗余的字段,如果第三范式中,订单信息表中可以增加客户名字段,这样查询订单信息表时就能将客户名查询出来,这就是增加了冗余字段. 原文地址:https://www.cnblogs.com/whylinux/p/9912087.html

mysql数据库优化之表的设计和慢查询定位

一.数据库优化包含的方面 数据库优化是一种综合性的技术.并非通过某一种方式让数据库效率提高非常多.而是通过多方面的提高.从而使得数据库性能提高. 主要包含: 1.表的设计合理化(3范式) 2.给表加入合适的索引.怎样使用索引 3.分表技术(水平切割.垂直切割) 4.定时清除数据垃圾,定时碎片整理 5.多用存储过程和触发器 6.对mysql配置进行优化 7.读写分离 8.mysqlserver硬件升级. 二.数据库的设计 步骤: 1.收集信息:与该系统有关人员进行交流.充分了解数据库须要完毕的任务

PHP连接MySQL数据库的三种方式(mysql、mysqli、pdo)

PHP与MySQL的连接有三种API接口,分别是:PHP的MySQL扩展 .PHP的mysqli扩展 .PHP数据对象(PDO) ,下面针对以上三种连接方式做下总结,以备在不同场景下选出最优方案. PHP的MySQL扩展是设计开发允许php应用与MySQL数据库交互的早期扩展.MySQL扩展提供了一个面向过程的接口,并且是针对MySQL4.1.3或者更早版本设计的.因此这个扩展虽然可以与MySQL4.1.3或更新的数据库服务端进行交互,但并不支持后期MySQL服务端提供的一些特性.由于太古老,又

[PHP]PHP编程操作Mysql数据库的三种方式

当我开始去接触PHP的时候,真切的感受到其所具有的魅力,本着学习的态度和打破固有的语言和模式的想法,开始了PHP之旅,总的来说,走的还是比较顺利,在其中能够看到C,Java,Perl影子,学习曲线不大,但是做好产品仍然有着一条漫漫长路. 多余的话不说了,慢慢感受和领悟,本文主要讲述PHP操作数据库的三种扩展. 如下图是PHP访问数据库的三种扩展方式: 下面举出三种方式访问数据库并查询数据的实例代码: 1.mysql扩展 <?php //1:获取数据库连接 $connection = @ mysq

Python学习日记(三十五) Mysql数据库篇 三

使用Navicate 创建一个连接去使用Mysql的数据库,连接名可以取任意字符但是要有意义 新增一个数据库 填写新数据库名,设置它的字符集和排序规则 新建一个表 增加表中的信息 点击保存再去输入表名完成创建,再添加数据: 使用外键将两表产生联系 再创建一个department表 添加数据: 创建外键,右键userinfo设计表创建外键: 写入SQL语句 点击查询->新建查询 转储SQL文件 将SQL文件进行备份 保存数据和结构 保存结构 使用终端进行转储 保存数据和结构(备份) 保存结构(备份

MySQL数据库学习三 MySQL数据库基本操作

3.1 数据库和数据对象 1. 系统数据库 information_schema:主要存储系统中的一些数据库对象信息,如用户列表信息.列信息.权限信息.字符集信息和分区信息等. performance_schema:主要存储数据库服务器性能参数. mysql:主要存储系统的用户权限信息. test:测试数据库,任何用户都可以使用. 2. 用户数据库 数据库对象,是指存储.管理和使用数据的不同结构形式,主要包含表.视图.存储过程.函数.触发器和事件等. 3.2 数据库相关操作 1. 创建数据库 c

数据库的三范式

1.第二范式(1NF) 在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库. 所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性.如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系.在第一范式(1NF)中表的每一行只包含一个实例的信息.简而言之,第一范式就是无重复的列. 2.第二范式(2NF

MySQL数据库实验三:连接查询

实验三    连接查询 实验名称:连接查询(2课时) 一.实验目的 理解JOIN语句的操作和基本使用方法,掌握内连接.外连接.自身连接的概念和使用. 二.实验环境 是MS SQL SERVER 2005的中文客户端. 三.实验示例 1. 查询每个学生及其选修课程的情况 SELECT  Student.*,SC.* FROM     Student,SC WHERE  Student.Sno = SC.Sno: 2.检索至少选修课程号为C2和C4的学生学号 SELECT X.S# FROM SC