日期:2014-05-18  浏览次数:20406 次

多层分类的表结构在应用中产生的一些疑问

闲话少叙,ASP.NET环境,现有一类别表:类别ID+类别名称+父类别ID,无限级别嵌套。
数据举例:
001                   诗人                         000
002                   中国诗人                 001
003                   燕赵诗人                 002
004                   江南诗人                 002
。。。   。。。
另有一内容表:ID+所属类别ID+值
数据举例:
001                   003                           荆轲
002                   003                           张飞
003                   003                           刘备
004                   004                           刘基
005                   004                           王老吉
。。。   。。。
要求如下:指定一个类别然后得到该类别下面的所有的成员,关键是这里,如果指定的类别下面还有子类别那么该子类别下面的成员也要查询出来。比如指定燕赵诗人(003),那么应该返回荆轲、张飞、刘备,如果指定中国诗人(002),那么上面的都应该返回。
我的思路如下,写一个递归方法,传递一个类别ID进去,将其记录到一个ViewState或者是HiddenField中,查询它的子类别,调用递归方法本身,将它的子类别ID传进去,这样到最后该类别及它下面所有的子类别以及子类别的子类别。。。。。。都将被记录,最后在SQL语句中用in关键字,形如:select   *   from   内容表   where   所属类别ID   in   (被记录的类别及其子类别以及。。。。。。),问题来啦,那如果类别非常多呢,比如上百个,那这样做会不会效率太低呢?可是还有什么其它解决之道吗?  


------解决方案--------------------
我 觉得你的思路不好.
为什么你要一次把下面所有的ID全部显示出来呢?
我觉得有个思路可行,就跟操作系统的文件系统一样,当你打开一个文件夹时候,就显示该文件夹里的所有文件和文件夹,而对于文件夹里面的子文件夹里的东西则不显示出来.相当于一个树型结构似的.根据这个原理,我提供一个解决的方案给你:

比如你可以用一个GridView控件,初始化的时候只显示中国诗人,然后你给中国诗人做个链接,点了这个链接之后又重新绑定GridView控件,进入中国诗人的下级目录:燕赵诗人,江南诗人.然后你点江南诗人,燕赵诗人就同理了,分别进入自己的子目录.这样就很好实现了.

我以前做过一个文件管理系统,原理跟你的差不多,也是一个文件有它的父文件ID,就是通过实现文档树型结构实现的.

你可以参考下这个思路,如果不理解,我们可以共同探讨下,我也是个新手,大家共同进步