给定一个表(AccountId,ParentId NULL),我们希望能够快速找到:1.主父ID(ParentId为空的accountId)。2.给定帐户ID的所有子项。
有了CTE,这相当容易。但是,我们不能将CTE保存在索引视图中,这会影响性能。我们还提出了一些其他想法,比如在另一个领域保存路径(id1/id2/id3),但这感觉有点过时。
我们想到了一个触发器来保存每行的"主"ID,但我们不确定这在链的中间是如何工作的(1拥有2拥有3,但随后2转移到7)。它也不能解决"查找所有子项"的查询。
有什么想法吗?我们使用的是SQL 2008 R2,但可以改用SQL 2012。
在SQL 2008中,有一种hierarchyid类型,它基本上实现了将路径保存到根目录。http://technet.microsoft.com/en-us/library/bb677290%28v=sql.100%29.aspx
如果您的层次结构大多是静态的,那么另一种选择是使用该表的非规范化版本,每个子代都有一个父级的组合。因此,如果你的层次结构是A是B的父级,而B是C的父级的话,那么非规范化的表可以看起来像这个
parent child depth
A A 0
A B 1
A C 2
B B 0
B C 1
C C 0
现在,如果同时对父列和子列进行索引,则搜索层次结构的速度会非常快。