遇到的数据库方面的问题

最近项目中的一个表结构是这样的:

CREATE TABLE Category (
id int(11) NOT NULL,
name varchar(50) default NULL,
parent_id int(11) default NULL,
depth int(11),
PRIMARY KEY (id),
FOREIGN KEY (parent_id) REFERENCES Category(id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

目录结构是一个典型的树形结构,而树形结构则会涉及到查找的递归问题。当要查找一个节点下所有的子节点的时候(或一个节点上的所有父节点),所谓“所有”即是从该节点之上或之下的任何节点,并不仅仅是其直接父或子节点,就要递归地往上(往下)查找直到目录树的父节点(叶节点)为止。当树的深度和广度都比较大的时候,这样的查找方式显然是比较费时费力的。其实引起这个问题的根本原因就是“一个节点只知道跟它紧邻节点的信息”。导致“树节点”目光如此短浅的罪魁祸首就是肚里墨水太少,消息闭塞,都是吃了没文化的亏啊!对于这样的一个常见问题有没有一个解决办法呢?比较自然会想到的一个方法就是,大力开展九年义务教育,多教教它族谱之类的,譬如“你现在是搞开发的,你老爹是开快餐店的,当初你爷爷可是拉三轮车的哦,你爷爷他爹还是打铁的呢。咱们的日子真是越过越红火啊!儿za,你可得记住,我们都是党的子孙哟”。要记住这么多东西,不多长个心眼那可不行那,因此得再向上面的表添加一个字段:

CREATE TABLE Category (
id int(11) NOT NULL,
name varchar(50) default NULL,
parent_id int(11) default NULL,
depth int(11),
path varchar(500) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (parent_id) REFERENCES Category(id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

其中path是这样定义的:
1.若为顶级目录,path为null;
2.否则,则为父目录path+'分隔符‘+父节点id(若父目录就是顶级目录则没有分隔符)
好,假如现在有一个搞开发的他想知道解放前他的祖先是干啥的,因为一开始他爹就跟他讲了好多故事,所以他很快就知道他祖先原来是闹革命的,根本就用不着一层一层往上去查。那么,假如一个想知道开理发店的张大胖他有多少后代呢,只要大声喊一句“诶,理发佬张大胖的后代来报道lei!”,下面听到召唤的“刷”地站直了排上队来还以为搞有奖竞猜呢。
sql语句是这样的:

SELECT * FROM Category WHERE path LIKE 'path%’;
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页