概念
数据模型由三部分构成:数据结构,数据操作和完整性约束。
关系模型三部分构成:关系数据结构,关系数据操作和关系完整性约束。
关系数据库是以集合论中关系的概念为基础发展起来的。
域:一组具有相同数据类型的值的集合。比如说{男,女},自然数等。
n个域的笛卡尔积上的任意一个子集称为这n个域的一个关系。当n=1时,称为一元关系,n=2时,称为二元关系。
关系中的每一行对应一个元组。
关系模式:关系模式是对关系的描述,包括关系名,属性名,属性的长度以及属性之间固有的数据关联关系,关系模式一般简记做关系名和属性名的集合。
关系模式的集合称为关系数据库模式,是对数据库中所有数据逻辑结构的描述。
键:能够唯一标识元组的属性或者属性组称为关系的键。
候选键:关系中能够起标识作用的键称为候选键。
主键:在一个关系中,如果有多个候选键,选其中的一个键作为主键。
外键:假设关系R的一个或一组属性F,但不是R的键。如果F与基本关系S的主键KS对应,称F是基本关系R的外键。
完整性约束:
实体完整性:主键的值不能为空或部分为空。
参照完整性:是对关系中作为外键的值的约束。如果关系R1中属性A是另一个关系R2中的主键,对于关系R1中的任意一个元组在属性A上的值或者为空,或者为R2中某个元组的值。
用户定义的完整性:用户根据需要设计的约束条件,比如成绩不能为负数,输入格式有要求。
数据库的三级模式结构,是三个抽象级别,为了实现数据的转换,数据管理系统必须提供两层映射功能,即外模式和模式的映射,模式和内模式的映射。
外模式(用户模式),外模式按用户视图定义数据,能够从模式中导出。
模式(逻辑模式),为了实现数据库数据的共享,进行数据库设计之后,得到的全局性数据逻辑关系的抽象和描写叙述。独立于数据的内模式
内模式(物理模式),用来描述数据在数据库中的存储和存取方式。
在数据库系统中,外模式可以有多个,而模式和内模式只能有一个。
SQL
在SQL中,关系模式称为基本表。基本表的集合形成数据库模式,对应三级模式结构的模式。
基本表在物理上与存储文件对应,所有存储文件的集合称为物理数据库。
视图构成外模式。
事务
什么是事务?
事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
事务是恢复和并发控制的基本单位。
四个特性
Atom,原子性。要么全不做,要么全做。
Consistency,一致性。事务的执行结果必须是使数据库从一个一致性状态变成另一个一致性状态。
Isolation。并发执行的事务,一个事务的执行不能被其他事务干扰。
Durability。持久性。一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。
事务并发的问题
丢失更新。
不可重复读。
读脏数据。
事务的隔离级别
读未提交。
不可重复读。
可重复读。
串行化。
索引
是数据库管理系统中一个排序的数据结构,索引的实现通常使用B树或者B+树。
索引的优点
加快查找。
索引的缺点
耗费时间。
耗费空间。
索引的数据结构
- 为什么不使用hash。hash仅仅能满足=和IN查询,不能使用范围查询,因为hash后的hash值是无序的。
- hash值也无法用来用来排序。
- hash的冲突。
B树和B+树
为什么mysql使用B+树作为索引,而mongodb使用B树作为索引。
B+树的信息都存在叶子节点,并且叶子节点之间相互连接,便于进行顺序查找。B+树的单次查询时间是固定的(因为都在叶子节点)。
而B树在非叶子节点中也存有信息,单次查询时间最好是O(1)。单次平均查询时间要优于B+树,但是顺序查找的话,就没有B+树方便。
redis为什么是单线程的
看参考文献2的评论,别看文章!!!!
- 因为redis开始的使用场景是IO密集型的,单线程就可以满足,使用IO多路复用。而如果是CPU密集型的,就可以使用多线程。
- 而且多线程需要加锁,编码复杂,单线程避免了加锁。
- 线程上下文切换不是原因,IO和锁的开销要比线程上下文切换大的多。而且都多核CPU,根本不需要切换。
redis是key-value数据库,数据之间没有约束。
布隆过滤器[3]
布隆过滤器可以用来判断一个东西是不是一定不在某个集合或者可能存在在某个集合。
缓存穿透[4]
请求数据库中根本不存在的数据,这样子在缓存中查不到,就要到数据库查。
- 可以使用布隆过滤器,在数据库中插入一个key,更新一下布隆过滤器。这样子缓存中查不到,要到数据库查时,先使用布隆过滤器查一下是不是数据库中有这个东西。
- 或者直接在缓存中把这个查询key的结果置为空。
缓存雪崩
缓存的过期时间相同时,导致缓存在某一个时刻同时失效,所有的请求都转发到数据库。
- 加锁。
- 缓存过期时间不同,加上随机值。
缓存击穿
某个key过期时,忽然这一个key被高并发的访问,和雪崩的区别在于雪崩是多个key,而击穿是单个key。当请求发现缓存过期,都会从数据库加载并设置到缓存中,大并发的请求可能会把后台数据库压垮。
- 使用互斥锁。
参考文献
1.https://www.cnblogs.com/wenxiaofei/p/9853682.html
2.https://zhuanlan.zhihu.com/p/87233515
3.https://www.cnblogs.com/liyulong1982/p/6013002.html
4.https://www.cnblogs.com/bob-zb/p/12583624.html