数据库用来做什么?为什么要用数据库
数据库就是用来存储数据的。
我们可以用文本文档,excel文档,文件夹中的各种文件来存储数据。那么用数据库存储数据有什么优点?
相对于其它方式,用数据库存储数据有以下优点:
- 解决数据的大小问题,可存储大量数据
- 容易更新
- 准确性
- 解决数据冗余,比如在excel中有成千上万的数据不容易查找重复的数据
- 更安全,比如用文件的方式容易泄露数据
- 重要性,数据更安全,数据库更容易容灾备份
数据库的相关概念
使用主键管理数据唯一性
使用主键和外键管理一对多的数据
使用联合表管理多对多的数据(一般该表中只有两列,每列对应另外一个表中的主键)
DBMS (Database management system)数据库管理系统,用来管理数据库,严格的说我们通常说的Oracle,MS SQL,DB2等都是DBMS而不是数据库。
ACID原则:(Atomic Consistent Isolated Durable)数据库中事务的几个原则
- 原子性:要么全部成功,要么全部不成功,回到最初状态;
- 一致性:所有事务不管并发还是穿行执行后数据是一致的;
- 隔离性: 同一时间只有一个请求作用于同一数据;
- 持久性:事务完成后,该事务对数据库所做的更改便持久的保存在数据库中,并不会被回滚。
SQL:(Structured query language)是申明式查询语言,用来做在数据库中做CRUD(Create Read Update Delete)创建读取更新删除操作
SQL中支持的运算符:> < <> >= <= AND OR
字符串使用单引号
可使用LIKE like 'a_c' 可匹配abc acc adc等等
使用LIKE 'my%' 可匹配my开头的任意字符串
是否为空 IS NULL, IS NOT NULL
聚合函数:MAX MIN COUNT SUM AVG GROUP BY
JOIN table ON (默认为内联)
外联:LEFT OUTER JOIN 左边的表中的数据会全部列出
RIGHT OUTER JOIN 右边的表中的数据会全部列出
数据库建模需要考虑的问题:
- 我创建这个数据库是用来做什么?
- 我已经有什么?(已有的数据,人员储备,现有数据库)
- 有哪些entities?(你的实际业务对象)
- 每个entity有哪些属性?(规范属性命名,属性类型,是否必须,是否需要Unicode,是否有缺省值)
组合键:单个键不是唯一,组合后是唯一的
ER 图(Entity relationship diagram):便于理解数据库中的逻辑关系
参考完整性:数据库中为保障数据一致性和完整性的强制规则,比如不能插入外键不存在的数据
关系型数据库的范式(Normalization Format):
- 第一范式(1NF):每列数据只存一个数据,而不是数据集合
- 第二范式(2NF):首先需要满足第一范式,其次表中非键值的列依赖于键值(只在有组合键的时候需要考虑)
- 第三范式(3NF):首先需要满足第二范式,其次没有非键值的列依赖于别的非键值的列
有时候为了性能会破坏范式
DDL (Data Definition language)用来定义数据库的schema
VARCHAR(variable length character)可变长字符串,是数据库表中某列的数据类型,其优点可变长灵活,但固定长度可能更节省空间和效率。
索引:clustered index(主键索引)non-clustered index 非主键索引,索引可以大大提高查询效率,但是如果数据库表中未每一个列都做索引会大大阻碍数据写入效率,因为会增加插入索引表的时间。
事务锁
为了保证数据不会被同时修改发生差错,引入事务锁的概念,在同一时间,只能有一个请求可以操作同一数据。
悲观锁(Pessimistic locking ),总是假设最坏的情况,每次取数据时都认为其他线程会修改,所以都会加锁(读锁、写锁、行锁等),当其他线程想要访问数据时,都需要阻塞挂起。
乐观锁(Optimistic locking),总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改。
存储过程:将SQL作为函数存储在数据库中供外部调用,好处是DBA可以进行充分优化,可以传递参数,可避免SQL注入
ORM(object-relational mapping)对象关系映射,为编程语言和关系型数据库表之间做对象关系映射
数据库的分类
- 关系型数据库:目前最成熟应用最广泛的数据库
- 对象数据库:为了解决面向对象编程和原有关系型数据库的表不匹配的痛点
- 键值数据库:数据作为键和值存储
- 文档数据库:数据作为文档存储
- 图数据库:更加侧重数据中的关系和连接
- NoSQL数据库:NoSQL数据库已经演变为Not only SQL数据库,表示不仅仅是sql数据库,是一种新型的数据库类型,它包括上面的文档数据库,图数据库等
在传统关系型数据库和NoSQL数据库中选择:
你是否需要弹性的schema?如果你的数据库schema经常变动,NOSQL会是更好的选择。
你是否有非常大量的数据?如果你的数据量非常大,NOSQL也许更适合你。
你最在意扩展性还是数据一致性?数据一致性是关系型数据的强项,相对来说NOSQL数据库的扩展性可能更好。