关系型数据库
-
mysql: 广泛
-
oracle:大型软件公司,面向政府、银行
-
sqlserver:大型工厂、ERP(企业资源管理)
-
sqlite: 手机端、安卓
-
db2
-
达梦数据库
-
人大金仓
-
创建的数据库
image.png
数据库起名规则 公司名缩写业务名缩写用途(dev:开发 、test: 测试、prod: 生产)
-
数据库语句
show databases; # 显示数据库
use 数据库名; # 切换数据库
create database 数据库名; # 创建数据库
drop database 数据库名; # 删除数据库 -
数据库中包含数据表(Table)
系统表(sys_业务名:sys_user)、业务表( bs_goods 或者 shop_goods)
-
数据表的字段
- 整数类型:int、tinyint 、 smallint、bigint
- 浮点型:decimal(指定保留几位)、float、double
- 字符串类型 char(6): 字符定长为6 一般使用 char(1) 例如性别
varchar 可变长度
text 超大文本存储 - 时间: date、datetime、timestramp(时间戳)
-
约束
- 主键约束:primary key (列名1,列名2)一张表通常情况下需要主键约束,值不允许重复
- 外键约束: foreign key(列名) 和不同的表之间的列做关联,删除/修改的时候产生连锁反应
- not null: 列中的数据不能为空
- unique key: 唯一约束,null 允许存在
- auto increment:自动递增,做主键使用,其他列不适用
- default: 默认值
- 创建表的语句
create table 表名(
列名1 类型 [not null][auto increment] [default 与类型对应的数据]
,列名2 类型 [not null] [default 与类型对应的数据]
....
primary key (列名1,[列2])
)
范式、
第一范式
基于列的原子性,列不能再被拆分成其他列(不考虑主键)
联系人表(姓名、性别、电话) 不符合第一范式
改造后
联系人表(姓名、性别、手机号码、固定电话、公司座机) 符合一范式
第二范式
- 是一个1NF
- 必须有主键
- 非主键列完全依赖于主键
订单表
ID、订单号、商品ID、商品名称、商品数量、商品价格、省、市、县/区、详细地址 不符合二范式
改造后
订单表
ID、订单号、商品ID、商品数量、省、市、县/区、详细地址
商品表
商品ID、商品名称、商品价格
符合二范式
第三范式
- 是一个2NF
- 非主键列A 不能依赖于非主键列B
订单表
ID、订单号、商品ID、商品名称、商品数量、商品价格、联系人姓名、联系人手机号、省、市、县/区、详细地址 符合二范式,不符合三范式(省、市、县/区、详细地址 四列和 联系人姓名列有隐含的列传递关系)
改造后
订单表
ID、订单号、商品ID、商品数量、联系人ID
商品表
商品ID、商品名称、商品价格
联系人表
ID,姓名、性别、手机号码、省、市、县/区、详细地址
# 举例: 学生表、课程表、成绩表
学生表:ID、姓名、学号、身份证号
课程表:ID、课程名称、上课时间、第几节课
成绩表:学生ID、课程ID、平时成绩、考试成绩
表之间的关系
- 一对一 (学生表和学生详情信息表、用户表和实名认证表)
- 一对多 或 多对一(用户表和订单表、学生表和成绩表)
- 多对多 (订单表和商品表、课程表和成绩表)
事务四大特性 ACID
- 原子性 A 全部成功(提交)或全部失效(回滚)
- 一致性 C 数据在提交之前的状态 不因为中途的特殊情况导致的中断而改变
- 隔离性 I 不同的事务间拿到的数据相互隔离,不直接影响
- 持久性 D 事务提交成功后,数据永久保存
数据脏读
索引
提升数据量大的时候查询效率
- 主键索引
- B+普通索引
- 唯一索引
B+索引结构只保存地址指向,不保存具体值,有别于树
网友评论