在写代码之前必须搞清楚持久层的意义是什么?持久层是必要的吗?
持久层对于持久是相对于瞬时来说的,持久层,可以理解成数据保存在数据库或者硬盘一类可以保存很长时间的设备里面,不像放在内存中那样断电就消失了,也就是把数据存在持久化设备上 。企业应用中,数据很重要(各种订单数据、客户数据、库存数据之类的),比应用程序本身更重要, 所以需要把数据持久化。现在大数据时代,可以说不仅是企业应用,几乎所有应用都是需要持久层支持的。持久化可以通过很多方式,写文件和数据库都可以。只是现在企业一般都会选择把数据持久化到数据库中,因为可以很方便的查询统计分析,但数据库的数据最终还是会写到磁盘上的。
那么数据库是如何实现快速对数据进行操作的呢?经过查阅资料,了解到数据库依靠着索引和数据结构课上学习的B+Tree实现高效获取数据。索引是对记录集的多个字段进行排序的方法。在一张表中为一个字段创建一个索引,将创建另外一个数据结构,包含字段数值以及指向相关记录的指针,然后对这个索引结构进行排序,允许在该数据上进行二分法排序。但这样存在着一定的副作用,即索引需要额外的磁盘空间,相当于以空间换时间了。
索引的好处,以下面的表为例:
字段名 | 数据类型 |
---|---|
id (Primary key) | Unsigned INT |
firstName | Char(50) |
lastName | Char(50) |
emailAddress | Char(100) |
假设数据库中有r=1000000条记录,在id字段上的线性搜索平均需要N/2 = 500,000块访问来找到一条记录假设id字段是查询关键值,不过既然id字段是有序的,可以执行一个二分查询,这样平均只需要访问log2 (1000000) = 19.93 = 20 个数据块。但通过firstName字段查找时候,由于firstName字段既不是有序的,无法执行二分搜索,数值也不具有唯一性,所以对这张表的查找必须到最后一个记录即全表扫描N = 1,000,000个数据块访问。这就是索引用来改进的地方。
B+Tree是在数据结构课上学习的,他的好处十分显然了,如下图:
在这之后,开始写代码了,又遇到了下一个问题,是否采用持久层框架?我查了现在大部分用的都是ORM 即对象关系映射框架,,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中,采用映射元数据来描述对象关系的映射,使得ORM中间件能在任何一个应用的业务逻辑层和数据库层之间充当桥梁。
上述内容主要参考:
https://blog.csdn.net/qq_33530388/article/details/62053538
https://blog.csdn.net/GitChat/article/details/78787837