想复杂了!班级表:id 名称 根 一级 二级
1 “一年级一班” X学校 一年级 一班
2 “二年级一班” X学校 二年级 一班老师班级对应表:
老师id 班级id
1 1
1 2检索出所有属于一年级的项目:
where 一级='一年级'某老师既教“一年级一班”又教“二年级一班”,查询一年级的老师:
select distinct 老师id
from 老师班级对应表
where 班级id in (select id from 班级表 where 一级='一年级')
1 “一年级一班” X学校 一年级 一班
2 “二年级一班” X学校 二年级 一班老师班级对应表:
老师id 班级id
1 1
1 2检索出所有属于一年级的项目:
where 一级='一年级'某老师既教“一年级一班”又教“二年级一班”,查询一年级的老师:
select distinct 老师id
from 老师班级对应表
where 班级id in (select id from 班级表 where 一级='一年级')
我个人的意见是树的好坏在二个方面:
一、树的可扩充性,这方面链表理论上是没有限制的,但编码的方式由于受到编码长度的限制,其结构受到了很大的限制。
二、结构检索的效率,例如要检索某一级分类的所有子分类,那么用链表必须首先使用递归检索出所有属于此分类的所有ID然后用where ID in(1,2,3...)的方式的方式检索出相应的子分类,可见使用递归检索ID时效率本就很低,然后使用可能是SQL中效率最低的in,在层数、分类较少的情况下效率还可以,但随着层数、分类的不断扩充效率低就不用说了。而使用编码的方式只需要用lile '01%'就可以检索出所有的子分类,如果对编码的字段建立索引,而需要like的是后模糊检索,其效率比链表不知要好多少倍。
三、编程的效率,综合上面的结论,很容易知道,在层数、分类较少的情况下链表是很好的工具,但在多层次下编码的效率应该是最高的,并且其程序设计也很简单,无须又检索ID又in(...)。
回到我的问题,实际上这个问题与使用何种树并没有关系,因为使用链表和编码这些都只是在分类管理中的效率,但在一个老师对应多个班级时并不只是部门检索的问题,而是通过已知道的部门ID检索出属于这个部门的记录,对链表和编码实际上都是一样的。