SSM框架下,级联数据库表的访问查询
级联数据库表
在日常的软件设计中,多级联动的数据库表比较常见,如省市联动的数据,对这些数据按级分表的方式存储,以表示数据之间的包含关系。
一般情况下,不会使用外键将父、子级的数据库表进行关联,因为当需要对某个数据进行删除操作时,这个数据就需要数据库级联操作来去除对子表的影响,而这些操作的开销会很大(级数越多,开销越大)。
而解决这个问题的常用方法,就是在子级表中添加一个字段,存入对应父级表的id值,类似链表。
此设计,便于增加和更新操作,减小各级的耦合,类似于链表的结构,可以最大程度的减少对数据的修改。但空间的优化,导致的缺点毫无疑问的就是时间的牺牲。即当需要通过子级查询更上级的父级数据时,需要发起多次的查询。(子→父→爷)
例如: 通过一个商品,查询它所属的一级分类?(商品→N级分类…→三级分类→二级分类→一级分类)
如何快速通过子级查询父级?
下面进行一个粗糙的实验,使用SSM框架+MySQL+Junit,进行四级的级联查询(四级分类→三级分类→二级分类→一级分类),下例中均以一级分类作查询最终目标。
1.目前最原始的结构如下:
为了方便这里简化数据表的结构,对其重复进行10000次的查询,通过System.currentTimeMillis();记录时间差,当然由于Mybatis的一级缓存,使得这样重复查询的耗时、访问次数减少,这里粗糙地表现数据库的访问次数。
while (rount>=0){
//实际上向数据库发起了4次查询
FouthL fouth = dao.findFouth(1);
ThirdL third = dao.findThird(fouth.getThird_id());
SecondL secon