SQL反模式笔记2——分层存储与查询
这一章的“嵌套集”和“闭包表”,我赶脚着比较麻烦不实用,所以也就不细究了。
目标:分层存储与查询,比如地域字典表的存储
反模式:邻接表(总是依赖父节点)
邻接表维护树比较方便,但是查询很笨拙,如果要找一个节点下的所有子节点,要关联很多次,这个关联次数取决于树的深度,所以,邻接表不能用于存储比较深的树。
识别反模式:
我们的书一共有几层?
合理使用反模式:
如果树结构不深,可以用。
解决方案:
路径枚举:
用一个path保存所有祖先的完整路径。
优点:查询方便;
缺点:1、不能保证存储的值的有效性。2、增、删时,要考虑对原位置下的子节点如何处理,比较麻烦。3、如果还要维护一个排序path,那就更麻烦了。
嵌套集:
用nsleft存储所有后台的nsleft中最小的数-1,用nsright存储所有后台的nsright中最大的数+1。
优点:删除时,原来子节点的关系自动上移。
缺点:1、查询一个节点的直接上级或下级,很困难。2、增、删,困难。
闭包表:没看明白
结论:
邻接表:简单,但不适用于很深的表
枚举路径:无法保证引用完整性
嵌套集:无法保证引用完整性,太复杂
比报表:需要一个额外的表存储关系
个人意见:要么用邻接表,要么用邻接表+枚举路径。