相信有过开发经验的朋友都曾碰到过这样一个需求。假设你正在为一个新闻网站开发一个评论功能,读者可以评论原文甚至相互回复。 这个需求并不简单,相互回复会导致无限多的分支,无限多的祖先-后代关系。这是一种典型的递归关系数据。 对于这个问题,以下给出几个解决方案,各位客观可斟酌后选择。 一、邻接表:依赖父节点 邻接表的方案如下(仅仅说明问题): CREATE TABLE Comments( CommentId int PK, ParentId int, --记录父节点 ArticleId int, CommentBody nvarchar(500), FOREIGN KEY (ParentId) REFERENCES Comments(CommentId) --自连接,主键外键都在自己表内 FOREIGN KEY (ArticleId) REFERENCES Articles(ArticleId) ) 由于偷懒,所以采用了书本中的图了,Bugs就是Articles: 这种设计方式就叫做邻接表。这可能是存储分层结构数据中最普通的方案了。 下面给出一些数据来显示一下评论表中的分层结构数据。示例表: 图片说明存储结构: 邻接表的优缺分析 对于以上邻接表,很多程序员已经将其当成默认的解决方案了,但即便是这样,但它在从前还是有存在的问题的。 分析1: 查询一个节点的所有后代(求子树)怎么查呢? 我们先看看以前查询两层的数据的SQL语句: SELECT c1.*,c2.* FROM Comments c1 LEFT OUTER JOIN Comments2 c2 ON c2.ParentId = c1.CommentId 显然,每需要查多一层,就需要联结多一次表。SQL查询的联结次数是有限的,因此不能无限深的获取所有的后代。而且,这种这样联结,执行Count()这样的聚合函数也相当困难。 说了是以...
评论