SQL学习笔记——数据库设计三范式

数据库设计范式:
数据库表的设计依据。教你怎么进行数据库表的设计。

  • 第一范式:要求任何一张表必须有主键,没一个字段原子性不可再分。
  • 第二范式:建立在第一范式的基础之上,要求所有非主键字段完全依赖主键,不要产生部份依赖。
  • 第三范式:建立在第二范式的基础之上,要求所有非主键字段直接依赖主键,不要产生传递依赖。

设计数据库表的时候,按照以上的范式进行,可以避免表中数据的冗余,空间的浪费。

第一范式

最核心,最重要的范式
所有表的设计都需要满足。必须有主键,并且每一个字段都是原子性不可再分。
例(错误):

学生编号 学生姓名 联系方式
1001 张三 zs@gmail.com , 1359999999
1002 李四 ls@gmail.com , 13699999999
1001 王五 ww@163.net , 13488888888

问题:
1.没有主键
2.联系方式可以分为邮箱地址、电话

改正后:

学生编号(pk) 学生姓名 邮箱地址 联系电话
1001 张三 zs@gmail.com 1359999999
1002 李四 ls@gmail.com 13699999999
1001 王五 ww@163.net 13488888888

第二范式

建立在第一范式的基础之上,
要求所有非主键字段必须完全依赖主键,不要产生部分依赖。
例(错误):(学生老师关系表,多对多)

学生编号 学生姓名 教师编号 教师姓名
1001 张三 001 王老师
1002 李四 002 赵老师
1003 王五 001 王老师
1004 张三 002 赵老师

问题:不满足一二范式
没有主键
“张三”依赖1001,“王老师”依赖001,产生部份依赖。
产生部份依赖缺点:
  数据冗余,空间浪费,“张三”重复,“王老师”重复

改正后:
使用三张表来表示多对多的关系

学生表

学生编号(pk) 学生姓名
1001 张三
1002 李四
1003 王五

教师表

教师编号(pk) 教师姓名
001 王老师
002 赵老师

师生关系表

id(PK) 学生编号(FK) 教师编号(FK)
1 1001 001
2 1002 002
3 1003 001
4 1001 002

多对多,三张表,关系表两个外键!!!

第三范式

第三范式建立在第二范式的基础之上
要求所有非主键字典必须直接依赖主键,不要产生传递依赖。

学生编号(PK) 学生姓名 班级编号 班级名称
1001 张三 01 一年一班
1002 李四 02 一年二班
1003 王五 03 一年三班
1004 赵六 03 一年三班

问题:满足一二范式,不满足第三范式
一年一班依赖01,01依赖1001,产生了传递依赖,数据冗余
改正后:
班级表:

班级编号 班级名称
01 一年一班
02 一年二班
03 一年三班

学生表:

学生编号(PK) 学生姓名 班级编号(FK)
1001 张三 01
1002 李四 02
1003 王五 03
1004 赵六 03

一对多,两张表,多的表加外键!!!


表的设计
一对多:一对多,两张表,多的表加外键!! ! ! ! ! ! ! ! ! ! !
多对多:多对多,三张表,关系表两个外键!!!! !!! !! ! ! ! ! ! !
一对一:在实际的开发中,可能存在一张表字段太多,太庞大。这个时候要拆分表。
t_user

id | 一对多:
一对多,两张表,多的表加外键!!!
多对多:
多对多,三张表,关系表两个外键!!!
一对一:
一对一,外键唯一!!!
一对一放到一张表中不就行了吗?为啥还要拆分表?
在实际的开发中,可能存在一张表字段太多,太庞大。这个时候要拆分表。一对一怎么设计?
没有拆分表之前:一张表
t_user

id login_name login_pwd real_name email address. .
1 zhangsan 123 张三 zhangsan@xxx -
2 lisi 123 李四 lisi@xxx -

这种庞大的表建议拆分为两张:
t_login登陆信息表

id(pk) login_name login_pwd
1 zhangsan 123
2 lisi 123

t_user用户详细信息表

id real_name email address. . login_id(fk+unique)
100 张三 zhangsan@xxx - 1
200 李四 lisi@xxx - 2

PS:

数据库设计三范式是理论上的。
实践和理论有的时候有偏差。
最终的目的都是为了满足客户的需求,有的时候会拿冗余换执行速度。
因为在sql当中,表和表之间连接次数越多,效率越低。(笛卡尔积)

有的时候可能会存在冗余,但是为了减少表的连接次数,这样做也是合理的,并且对于开发人员来说,sql语句的编写难度也会降低。

面试的时候把这句话说上:他就不会认为你是初级程序员了!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容

  • 什么是数据库设计范式? 数据库表的设计依据。教你怎么进行数据库表的设计。 第一范式: 要求任何一张表必须有主键,每...
    BrightUltimate阅读 207评论 0 1
  • 数据库对于后端开发来说是必不可少所要用到的,而MySQL数据库是其中的主流之一,在中小型公司中使用的较为广泛,作为...
    Steven_SHH阅读 1,459评论 0 2
  • 数据库的三大范式 A:第一范式  数据库表中不能出现重复的记录,每个字段是原子性的不能再分 存在问题:1: 最后...
    渣渣进化论阅读 530评论 0 3
  • 1.什么是数据库设计范式? 数据库表的设计依据。教你怎么进行数据库表的设计。 2.数据库设计三范式 第一范式:要求...
    Maple0831阅读 264评论 0 1
  • 首先介绍几个概念: 函数依赖 定义:设X,Y是关系R的两个属性集合,当任何时刻R中的任意两个元组中的X属性值相同时...
    eliter0609阅读 13,265评论 4 16