数据库

关系型数据库的范式

范式可以理解为设计标准

第一范式 1NF

  • 定义

字段不可再分

  • 举例
存储体检者的双眼视力
那么应该存为左眼视力和右眼视力两个字段
即user表里应该有 left_eye 和  right_eye 
而不能把它们存在一个字段

第一范式 的缺点

image.png

存在如下问题:
  • 数据冗余
  • 创建系时插入异常
  • 删除学生会导致系消失
  • 学生转系时改动多处
结论:第一范式不够强

第二范式 2NF

  • 定义(不准确)
在1NF的基础上,要有键(键可由多个字段组成)
所有字段分别完全依赖于键
如果键是多个字段组合,则不允许部分依赖于该键
  • 依赖关系
给出键,就能唯一确定字段的值
如给出学号,就能唯一确定姓名,反之则不行
则称姓名依赖于学号
  • 上表不满足第二范式的地方
上表的键为(学号,课名)
但存在部分依赖:姓名依赖于学号
  • 改进
选课表(学号、课名、分数)
学生表(学号、姓名、系名、班主任)
image.png

第三范式 3NF

  • 定义(不准确)
一个表里不能有两层依赖
给出学号,就能确定系名:系名依赖于学号
给出系名,就能确定系主任:系主任依赖于系名
所以,系主任间接依赖于学号
  • 解决办法
    把系名和系主任单独建表
    image.png

总结

  • 第一范式:属性不可分割
  • 第二范式:字段完全依赖于键
  • 第三范式:字段没有间接依赖于键
  • BC范式:键中的属性也不存在间接依赖(多个键之间互相依赖)

数据库设计经验

  • 高内聚

把相关的字段放在一起,不相关的分开建表

如果两个字段能够单独建表,那就单独建表

  • 低耦合

如果两个表之间有弱关系

一对一可放在一个表,也可两个表加外键

一对多一般用外键

多对多一般建中间表

一对一

假设一个学生只能加入一个班

  • 可以把班级放在学生表里

学生id:1001; 姓名:小明;班级id:4002

班级id:4002; 名称:入门1级

  • 也可以单独建立关联表

如果两个表之间有弱关系

一 学生id:1001; 姓名:小明;

一 学生班级id:2003; 学生id:1001;班级id:4002

班级id:4002; 名称:入门1级

一对多

假设一个作者能写多本书

  • 可以把书放在作者表立吗?

某些DBMS支持数组,可以存两个id到一个字段

作者id:1001;姓名:大牛;books:[2001,3002]

如果不支持数组,就不能这么做了

  • 单独建立关联表(推荐)

作者id:1001;姓名:大牛

出版id:2001;作者id:1001;书id:4002

出版id:2002;作者id:1001;书id:4003

书id:4002;名称:JS入门

什么时候建关联表

  • 当关联自身存在属性时

比如关联的有效期,有效期为一年

比如关联的级别,店铺会员分为VIP1~6

JOIN

  • 连接表

inner join

left join

right join

full outer join

  • 看图巧记


    image.png

    image.png

参考文章

语法

把表名改为

T1{INNER|{LEFT|RIGHT|FULL}[OUTER]} JOIN T2 ON boolean_expression
例如

SELECT A.PK AS A_PK, B.PK AS B_PK,
       A.Value AS A_Value, B.Value AS B_Value
FROM Table_A A
INNER JOIN Table_B B
ON A.PK = B.PK;

试试看1

  • 创建数据库
    CREATE DATABASE IF NOT EXISTS han DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
  • 创建表
create tables users(id serial, name text);
create table staffs(id serial, name text);
create table orders(id serial, user_id bigint unsigned, staff_id bigint unsigned, amount int unsigned);
image.png

试试看2

  • 创建记录
insert into users (name) values ('XiaoMing');
insert into staffs (name) values ('XiaoHong');
insert into orders (user_id,staff_id,amount) values (1,1,100);
image.png
  • 使用inner join

select users.name, orders.amount from users inner join orders on users.id=orders.user_id;

image.png

  • 使用left join

select users.name, orders.amount from users left join orders on users.id = orders.user_id;

image.png

其他 join

  • Left join

会保留右边的null,以保证左边都显示

  • Right join

会保留左边的null,以保证右边都显示

  • Full outer join

会保留两边的null,以保证两边都显示

缓存字段

假设一个博客包含多个评论comments

  • 如何获取博客的评论数
select count(id) from comments where blog_id=8
这样太慢了
可不可以在blog表上加一个comment_count字段
每次添加comment则+1
每次删除comment则-1
可以的

事务

  • 有些操作必须一次完成
用户评论之后,要做两件事
第一步,在comment表新增记录
第二部,在blogs表将对应的comment_count+1
如果第一步执行了,第二步没执行怎么办
数据就乱了

使用事务

菜鸟教程

create table runoob_transaction_test( id int(5)) engine=innodb;  # 创建数据表
begin;  # 开始事务
语句1;语句2;语句3;
commit; # 提交事务
rollback;   # 回滚
select * from runoob_transaction_test;   # 因为回滚所以数据没有插入

只要有一句出错,则全都不生效

image.png

索引

  • 语法
create unique index index1 on users(name(100));  //这里的100是索引长度,规定不能超过该字段类型的最大字符长度
show index in users;
image.png
  • 用途

提高搜索效率

where xxx>100 那么我们可以创建xxx的索引

where xxx>100 and yyy>200, 创建xxx,yyy的索引

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

推荐阅读更多精彩内容

  • 设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次...
    海边的蜗牛ng阅读 2,161评论 0 2
  • 数据库开发规范1. 数据库命名规范前缀对象前缀命名: 前缀命名一般用小写表的前缀: 业务模块组名前缀存储过程前缀:...
    PowerYangSoft阅读 2,355评论 0 8
  • 数据库设计范式及其意义和不足 补充:现在大型项目倾向于反范式设计,得益于大容量硬盘的白菜价和计算机的性能提升,表的...
    七枷琴子阅读 2,491评论 0 1
  • 文/Bruce.Liu1 1.建模简介 范式:英文名称是 Normal Form,它是英国人 E.F.Codd(埃...
    BruceLiu1阅读 5,449评论 0 9
  • 范式:英文名称是 Normal Form,它是英国人 E.F.Codd(关系数据库的老祖宗)在上个世纪70年代提出...
    42c64edf12e9阅读 919评论 0 0