关于数据库中的无限级别设计

来源:互联网 发布:apache beam storm 编辑:程序博客网 时间:2024/06/06 05:32

 

   今天一个网友在网上问我“无限极分类采用的什么方法”,一开始我还闷了,以为是什么新的技术,后来问清楚才知道是关于数据库设计方面的问题,害我一身⊙﹏⊙b汗,落伍了。

     言归正传,平时这种无限极分类,基本是导航中需要用到的,大概有四种方法:

       一、递归循环法:泰州seo一般都是在表里面建这么  编号,名称,父节点的编号三个字段基本可以解决问题了,读取的时候使用递归就都出来了。这种方法的优点是:理论上可以无限添加级别,修改的时候比较方便。当然也有比较明显的缺点,就是当级别比较多的时候是相当消耗资源。   

      二、设置fid字段类型为varchar,将父类id都集中在这个字段里,用符号隔开,比如:1,3,6这样可以比较容易得到各上级分类的ID,而且在查询分类下的信息的时候,可以使用:SELECT* FROM category WHERE pid LIKE“1,3%”。这种方法的优点是读取的时候是相当快的,但也有缺点就是修改的时候是比较麻烦的,而且单独查询某个节点的父节点和子节点的时候也是比较麻烦的。

      三、使用预排序遍历树算法,也叫左右值算法。特别适用于多层数据结构设计,像Windows,linux下文件夹结构。在这种数据结构中,设置每个节点的左右值为唯一。通过左右值把所有节点连接起来。按顺序遍历左右值到达查询效果,这种查询速度非常之快,而且只要一次查询就能得到想要的结果,可以轻易的查询节点是否存在子节点,父节点的路径等。但同样面临的在增删改的时候操作比较复杂。这种预排序遍历树算法的核心就是大量牺牲了写的性能来换取读取的性能。而且完全可以扩展到无限级应用。

数据结构:   
id: 类别id,主键
name: 类名
lft: 左值
rgt: 右值

     四、这个方法是泰州seo参考了一和三以后想到的方法:就是设计的时候还是使用第一种方法编号,名称,父节点的编号,但是在读取的时候并不是一次性全部都读取出来,只读取三层,在某一个节点被点击后,再去读取他的下两层,重新绑定,这样就可以省去第一次递归所消耗的资源了。而修改的时候又很方便,所以泰州seo觉得这种方法应该还是可行的。

责任编辑:泰州seo
转自:泰州SEO[http://www.96SEO.com]
原文链接:http://www.96seo.com/a/jingjiangseojianzhan/mssql/2011/0330/103.html
原创粉丝点击