文章目录

  • 数据库表设计
    • 三大范式
      • 第一范式
      • 第二范式
      • 第三范式
    • ER图与数据建模
      • 什么是ER图
      • ER图核心要素
      • ER图实践
      • 数据建模
    • 外键约束与级联操作
      • 外键
        • 什么是外键?
        • 什么是外键约束
        • 外键对表的影响
        • 外键约束的操作
          • 创建表时添加外键约束
          • 建表后添加外键约束
          • 查看表中的外键
          • 删除外键
      • 级联操作
  • 视图
    • 什么是视图
    • 为什么要用
    • 视图的操作
      • 创建视图
      • 修改视图
      • 删除视图
      • 查看视图
      • 使用视图
  • 索引
    • 什么是索引
    • 索引的分类
    • 索引的底层实现原理
    • 索引的操作
      • 创建索引
      • 查看索引
      • 删除索引
    • 索引注意事项
  • 触发器
    • 触发器的作用
    • 触发器四大因素
    • 触发器的操作
      • 创建触发器
      • 删除触发器
      • 查看触发器
      • 查看触发器的创建语法
      • 触发器的使用限制
      • 触发器的优缺点

学习目标

  • 数据库表设计

    • 三大范式
    • ER图与数据建模
    • 外键约束与级联操作
  • 索引
  • 视图
  • 触发器

数据库表设计

三大范式

设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。

第一范式

  • 第一范式(1NF)要求数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值。(单表如何设计)

比如说住址:xx省xx市xx区xx路
如果有相应的业务要求,这个字段就可以按第一范式进行拆分,这样在针对地址进行检索时更加精确方便

字段名 字段名 字段名 字段名
省份 xx省 地市 xx市 区名 xx区 街道名 xx路
  • 若某一列有多个值,可以将该列单独拆分成一个实体,新实体和原实体间是一对多的关系。

说人话:需要将一个事物拆分到无法拆分
如某人的成绩可以分为学生信息表、科目表、成绩表

第二范式

  • 满足第二范式需要先满足第一范式
  • 非主属性必须完全依赖主属性(多对多怎么设计)

如:订单表要有订单信息和货物信息,那只能订单编号和货物编号作为联合主键,但这样订单相关信息不依赖货物编号这个主属性,货物信息不依赖订单编号,不符合第二范式,所以要把这个订单信息表进行拆分,把商品信息分离到另一个表中,订单表的商品编号与商品表的商品编号产生多对1的关联,即可满足第二范式。

说人话:表内所有数据都要和主键有所关联

第三范式

  • 满足第三范式必须先满足第二范式。

  • 实体中的属性不能是其他实体中的非主属性。因为这样会出现冗余。即:属性不依赖于其他非主属性。(一对多怎么设计)

  • 如果一个实体中出现其他实体的非主属性,可以将这两个实体用外键关联,而不是将另一张表的非主属性直接写在当前表中。

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

说人话:表内所有属性都要和主键有直接关系,两表之间的联系要用外键连接

ER图与数据建模

什么是ER图

ER(Entity,RelationShip)图又称实体关联图、实体联系图,是用来描述实体本身以及与其它实体关系一种图。

ER图核心要素

  • 实体:长方形,即数据模型中的数据对象,例如人、学生、音乐都可以作为一个数据对象,用长方体来表示
  • 属性:椭圆形,即数据对象所具有的属性,例如学生具有姓名、学号、年级等属性,属性分为唯一属性和非唯一属性,唯一属性指的是唯一可用来标识该实体实例或者成员的属性,用下划线表示,一般来讲实体都至少有一个唯一属性(主键)。
  • 关系:菱形,用来表现数据对象与数据对象之间的联系
    三者之间要用线连接

ER图实践

学生考勤系统案例

此图就没有标明哪个是唯一属性

数据建模

比起ER图,数据建模更加常用

下面是账号表和角色表的数据建模
一个账号可以有多个角色

外键约束与级联操作

外键

什么是外键?

外键是用来建立两个表的关联关系的字段。 外键是表的一个字段,不是本表的主键,但对应另一个表的主键。

什么是外键约束

用来约束表中的数据必须符合外键表的相关条件,以及在更新数据,自动对关联表做出相关处理。

外键对表的影响

  1. 添加时外键的值必须是在外键表存在的
  2. 修改时外键的值必须是在外键表存在的
  3. 删除时,不能先删除外键主表中外键所在行记录,只能先删除外键所在表的记录

外键约束的操作

创建表时添加外键约束
[CONSTRAINT <外键名>] FOREIGN KEY 字段名 [,字段名2,…]REFERENCES <主表名> 主键列1 [,主键列2,…]
建表后添加外键约束
ALTER TABLE <数据表名> ADD CONSTRAINT <索引名> FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);
查看表中的外键
show indexes from 表名;
删除外键
ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;

级联操作

在涉及外键时,删除更新会受到限制,不允许删除,如要删除,要先去对应子表把对应数据删除后才能删改,若数据过多则很麻烦,因此可以在创建外键时使用级联操作来自动处理

语法:CONSTRAINT 外键名 FOREIGN KEY(列名) REFERENCES 主表名(主列名) ON 操作类型 级联操作类型

  • 操作类型是指删除(delete)、更新(update)

级联操作类型:

  1. 不做级联操作 RESTRICT、no action>

默认情况下就是不做级联操作,即子表有数据,则不准父表删改

  1. 级联更新、删除 CASCADE

父表在更新或者删除时,更新或者删除子表对应记录

  1. 设为NULL set null

则是表示父表在更新或者删除的时候,子表的对应字段被改为NULL

视图

什么是视图

视图是一张虚拟表,是一张逻辑表,本身没有数据。本质就是一段SQL,是一段保存在数据库,且可以重复利用的sql。

为什么要用

用视图的大部分情况是为了保障数据安全性,提高查询效率。

  • 简单:不用关注视图背后的表结构和逻辑,就把视图当成一表用。
  • 安全:仅能访问到视图返回的数据。

视图的操作

创建视图

语法:create VIEW 视图名 as 查询语句;

修改视图

语法:create or replace VIEW 视图名 as 查询语句;

删除视图

语法:drop view 视图名;

查看视图

语法:SELECT * FROM information_schema.views where table_schema='数据库名';

使用视图

语法:select * from 视图名;

索引

什么是索引

索引类似书籍中的目录,本质是一张表.

索引的分类

  • 主键索引(PRIMARY KEY)
  • 唯一索引(UNIQUE)
  • 普通索引(INDEX)
  • 全文索引(FULLTEXT)

索引的底层实现原理

索引的底层是一棵B+树

索引的操作

创建索引

  1. 直接创建索引
CREATE 索引类型 索引名 ON 表名(列名);
  1. 在已存在的表上追加普通索引
ALTER table 表名 ADD 索引类型 索引名(列名);
  1. 创建表的时候直接指定
create table 表名(...,索引类型 索引名(列名)
);

查看索引

查看表中的所有索引

show index from tc_9;

删除索引

删除指定索引

drop 索引类型 索引名 on 表名;

索引注意事项

  1. 索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
  2. 一张表最好不要超过3个索引
  3. 一个字段重复率超过30%时,不建议添加索引

触发器

触发器的作用

监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,例如当对一个表进行操作( insert,delete, update)时就会激活它执行

触发器四大因素

  1. 监视地点(table)
  2. 监视事件(insert/update/delete)
  3. 触发时间(after/before)
  4. 触发事件(内部执行逻辑)

触发器的操作

创建触发器

触发器针对的是数据库中的每一行记录,每行数据在操作前后都会有一个对应的状态,触发器将没有操作之前的状态保存到 old 关键字中,将操作后的状态保存到 new 中
需要注意的是,old 和 new 不是所有触发器都有

  • INSERT型触发器 没有 old,只有 new,new 表示将要(插入前)或者已经增加(插入后)- 的数据
  • UPDATE型触发器 既有 old 也有 new,old 表示更新之前的数据,new 表示更新之后的数据
  • DELETE型触发器 没有 new,只有 old,old 表示将要(删除前)或者已经被删除(删除后)的数据

语法:

delimiter $ //设置MySQL执行结束标志,默认为;create trigger tg_name  -- 触发器名称after|before  -- 触发时间insert|update|delete  -- 监视事件 on table_name -- 监控表名for each row  -- 固定写法begin  -- 开始触发器内部逻辑查询语句end$  -- 结束触发器内部逻辑delimiter ;  //重新将MySQL执行结束标志设置为;

PS:如果 before 触发器失败或者语句本身失败,将不执行 after 触发器(如果有的话)

删除触发器

语法:drop trigger 名称;

查看触发器

查看所有触发器:

show triggers;
select * from information_schema.TRIGGERS;

查看指定数据库、表的触发器

show triggers;
select * from information_schema.TRIGGERS where trigger_schema='数据库名' and event_object_table='表名';

查看触发器的创建语法

show create TRIGGER t1;

触发器的使用限制

触发器不是程序员手工调用的,是DBMS自动调用,由对应语句触发。
MySQL 的触发器中不能对本表进行 insert、update 和 delete 操作,否则会报错

触发器的优缺点

  • 优点
  • 触发器可以通过数据库中的关联表实现级联更改,即一张表数据的改变会影响其他表的数据
  • 可以保证数据安全,并进行安全校验
  • 缺点
  • 过分依赖触发器,影响数据库的结构,增加数据库的维护成本

MySQL入门-day06-数据库表设计、视图、索引相关推荐

  1. ezdml 支付mysql 吗_数据库表设计工具EZDML使用教程

    表结构设计器(EZDML) 这是一个数据库建表的小软件,可快速的进行数据库表结构设计,建立数据模型.类似大家常用的数据库建模工具如PowerDesigner.ERWIN.ER-Studio和Ratio ...

  2. MySQL数据库表设计

    MySQL数据库表设计 ​ 数据库设计(Database Design)是指对于一个给定的应用环境,构造最优的数据库模式,建立数据库及其应用系统,使之能够有效地存储数据,满足各种用户的应用需求(信息要 ...

  3. MySQL - 数据库表设计 - 范式

    目录 一.数据库设计的重要性 二.范式 - 简介: 1.什么是范式? 第一范式 - 单一列 第二范式 - 中间表 - 一对多 第三范式 - 不产生中间表 - 一对一.多对一 三.数据库表设计的注意要点 ...

  4. 数据库表设计索引外键设计_关于索引的设计决策 数据库管理系统

    数据库表设计索引外键设计 Introduction: 介绍: The attributes whose values are required inequality or range conditio ...

  5. mysql设计积分兑换表_积分系统数据库表设计.docx

    积分系统数据库表设计 文件编号:JHDZ/SJ 密 级: 云上城积分功能数据库设计文档 项目名称:<云上城>项目代号:XXX版 本:V1.0编制单位:平台运营编制日期:2014-10-08 ...

  6. mysql 字段数量不确定_不定字段数目的数据库表设计和数据结构 | 学步园

    两难的境界:不定字段数目的数据库表设计和数据结构 昨天项目组会议上讨论的关于不定字段数目的数据库表问题并没有结果,今天继续分析之后发现问题可能还更大.当时讨论的结果是可能采用四种技术: 动态增加数据库 ...

  7. mysql表设计原子性_数据库表设计-原子性

    好的数据结构会影响速度.好的数据库表设计会影响数据库操作效率.特别是数据多的时候,如果表的结构不好的话操作的时候条件(where后的内容)会变的非常复杂. SQL是关系数据库中用到的一种语言.所以,为 ...

  8. 数据库表设计、 数据库分层、myslq水平拆分、oracle表分区

    数据库表设计 数据库表结构设计方法及原则(li)数据库设计的三大范式:为了建立冗余较小.结构合理的数据库,设计数据库时必须遵循一定的规则.在关系型数据库中这种规则就称为范式.范式是符合某一种设计要求的 ...

  9. Oracle数据库表设计时的注意事项

    Oracle数据库表设计时的注意事项  表是Oracle数据库中最基本的对象之一.万丈高楼从平地起,这个基础对象对于数据库来说,非常重要.因为其设计是否合理,直接跟数据库的性能相关.从Oracle数据 ...

  10. 万字归纳总结 | 数据库表设计与SQL编写技巧

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"加入公众号专属技术群 前言 随着移动云平台系统业务不断增长,必然需要对各系统进行 ...

最新文章

  1. web-QQ(腾讯)-Email-TMessage(腾讯微博记事本)
  2. php 复杂密码生成,php随机密码生成器
  3. ECSHOP商品详情页”增加自定义TITLE
  4. 自学python该买几本书-自学Python一年,看了几十本书,我发现了这些捷径!
  5. 使用RMAN恢复数据库
  6. 【前端基础进阶】JS-Object 功能详解
  7. nagios监控linux主机及服务信息
  8. 【跃迁之路】【429天】程序员高效学习方法论探索系列(实验阶段186-2018.04.10)...
  9. internet信息服务(IIS)管理器 在哪里?
  10. 《云阅》一个仿网易云音乐UI,使用Gank.Io及豆瓣Api开发的开源项目
  11. matlab2016b慢,Matlab 2016a/b中调用GPU速度巨慢的解决办法
  12. idm下载器怎么下载网页视频?如何用idm自动下载网站文件?
  13. 网吧如何修改dns服务器地址,网吧更改dns服务器地址
  14. win10如何共享打印机_windows1064位系统如何连接window732位共享打印机
  15. Spire.Office for .NET 7.9.2 去掉license.dll注册功能
  16. unity——小球酷跑游戏制作
  17. JavaScript面试题②(JS面试题②)
  18. 黑客因网文作者写太烂盗其账号,帮改文更新修防火墙,网友:大佬能看看我的论文吗?...
  19. NEUQ ACM预备队训练-week5(图的基础存图和dfs)
  20. php语言计算行李托运费_乘飞机托运行李的价格怎么计算

热门文章

  1. python编程基本语法元素_第一章:Python基本语法元素
  2. Cucumber读书笔记
  3. 三大运营商一季度净利润 375 亿,5G 套餐用户 8.49 亿
  4. 一起学Git:欲学Git请先忘记
  5. 集成学习-Bagging-Boosting-AdaBoost
  6. java坦克大战登录界面设计_基于JAVA的坦克大战设计和实现-代码.doc
  7. JS 使用 lz-string存储 数据压缩
  8. 【调研】特殊网络图像的敏感词检测,图像文本检测提取
  9. 如何解决C盘空间不足的问题?
  10. labelme的json_to_dataset.py文件路径