数据库是一个程序,帮助管理数据用的。那么管理数据会面对哪些挑战呢?
- 数据在磁盘上可以高效管理的组织方式
- 并发时能保证ACID(因为很多系统对ACID的需求不那么严格,所以出现了某些NOSQL提出的最终一致性的调整)
- 在程序运行到任何一步发生断电/系统崩溃后,能恢复且保证ACID
- 分布式ACID
- 使用内存提高数据管理性能,但仍要保证ACID的前提
- 方便使用
说白了,就是在保证ACID(数据正确性)的前提下,对数据进行管理的程序。我提到了很多次ACID,具体就不展开来讲,网上有很多相关资料。无论怎么解读,其实就是在说保证数据的正确性这个议题。
如果要展开说,数据库的内容就很多了,我这里就简要地提几个关键的地方,短短几句话不可能面面俱到,请不要在意行文细节上的逻辑漏洞。
- 行级别的约束,比如性别(男/女),如果一个叫“火车”的性别记录到数据库里,那这个记录就失去了准确性了。
- 表级的约束,比如唯一约束uniq。
- 跨表级的约束,比如外键,例如一个学校有Bob/Lob两位班主任,那通过外键可以约束A班的班主任只能是Bob或是Lob。同时也能约束这个系统不能失去班主任Bob和Lob的信息,除非他们已经不属于任何一个班级了。
- 所有针对数据的改变都要落到磁盘上,大部分数据库的做法都是所有的修改都追加写入日志文件而不是直接修改存放数据的文件。这样就能做到回滚、断电保护等效果。
- 提高查询速度的内存缓存,数据库会把磁盘上的数据放入内存进行缓存,如果已经缓存好了,就不会再去磁盘上读了。虽然是缓存,仍不能抛弃ACID,这比平时用的如memcache等的缓存要求要严格得多。
- 提高查询速度的索引,数据库在进行很多操作的时候,都可以藉由索引提高速度,比如查询时select a where b = 1(b有索引),比如进行uniq判断时update a set b = 2(b要求唯一)。
- 多台数据库组成的分布式系统,需要保证整体上的ACID,一种设计就是一个全局的事务管理服务加上每个数据库都使用两阶段提交机制进行分段式事务管理。
每一个方面的展开,都有许许多多的细节,高效合理地数据管理是个大工程,所以就像操作系统一样,数据库这样一个程序经久不衰,一直被人关注着。