数据库分类
关系型数据库(SQL)
Mysql,Oracle, Sql Server,DB2,SQLlite
通过表和表之间,行和列之间的关系进行数据的存储
非关系型数据库(NoSQL)Not only sql
Redis,MongDB
非关系数据库,对象存储,通过对象的自身属性来决定
外键
物理外键,数据库级别的外键,不建议使用!避免数据库过多造成困扰
最佳实现
数据库就是单纯的表,只用来存数据,只有行(数据)和列(字段)
要使用多张表的数据,使用外键用程序去实现
DELETE和TRUNCATE区别
-
相同:都能删除数据,都不会删除表结构
-
不同:
-
TRUNCATE重新设置自增列,计数器会归零
-
TRUNCATE不会影响事务
-
-
DELETE删除的问题:重启数据库,不同类型的数据库是不同的现象
InnoDB 自增列会从1开始(存放在内存当中的,断电即失)
MyISAM 继续从上一个自增量开始(存在文件中的,不会丢失)
事务
ACID原则
1、 原子性(Atomicity)
要么都成功,要么都失败
2、一致性(Consistency)
事务前后的数据完整性要保证一致
3、持久性(Durability)事务提交
事务一旦提交则不可逆,被持久化到数据库中
4、隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之 间要相互隔离
隔离所导致的一些问题
脏读:
指一个事务读取了另外一个事务未提交的数据。
不可重复读:
在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)
虚读(幻读):
是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
索引的分类:
在一个表中,主键索引只能有一个,唯一索引可以有多个
主键索引只能有一个,唯一索引可以有多个
主键索引:(PRIMARY KEY)
唯一的索引,主键不可重复,只能有一个列作为主键
唯一索引:(UNIQUE KEY)
避免重复的列出现,唯一索引可以重复,多个列都可以标识为 唯一索引
常规索引:(KEY/INDEX)
默认的,index.key关键字来设置
全文索引:(FulText)
在特定的数据库引擎下才有,MyISAM
快速定位数据
索引原则:
索引不是越多越好
不要对经常变动数据加索引
小数据量的表不需要加索引
索引一般加在常用来查询的字段上
设计数据库
当数据库比较复杂的时候,我们就需要设计了
糟糕的数据库设计:
-
数据冗余,浪费空间
-
数据库插入和删除都会麻烦、异常(屏蔽使用物理外键)
-
程序的性能差
良好的数据库设计:
- 节省内存空间
- 保证数据库的完整性
- 方便我们系统开发
- 软件开发中,关于数据库的设计:分析需求,分析业务和需要处理的数据库的需求
三大范式:
第一范式:(1NF)
原子性:保证每一列不可再分
第二范式:(2NF)
前提:满足第一范式
每张表只描述一件事情
第三范式:(3NF)
前提:满足第一范式和第二范式
第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关。
规范性和性能的问题:
关联查询的表不得超过三张表
考虑商业化的需求和目标(成本,用户体验!) 数据库的性能更加重要
在规范性能的问题的时候,需要适当的考虑一下规范性!
故意给某些表增加一些冗余的字段。(从多表查询中变为单表查询)
故意增加一些计算列(从大数据量降低为小数据量的查询:索引)
JDBC 加载驱动
//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
Class.forName(com.mysql.jdbc.Driver);//固定写法,加载驱动,里面是静态代码块,使用上面的方法就加载两次,不需要加载两次
事务:
要么都成功,要么都失败
ACID原则
原子性: 要么全部完成,要么都不完成
一致性: 总数不变
隔离性: 多个进程互不干扰
持久性: 一旦提交不可逆,持久化到数据库了