2010-04-02 99 views
3

我想將網站頁面層次結構存儲在表中。在Sql Server 2008中存儲網站層次結構

我想達成什麼是有效
1)決心(最後一次有效)的路徑(例如「/blogs/programming/tags/asp.net,sql-server」,「/博客/編程/項目你好-world」)
2)獲得breadcrump
3)編輯項目祖先項目,而不更新,因爲第三點我認爲孩子的整個樹,孫子女等

表也能像

ITEM 
id type  slug   title    parentId 
1  area  blogs   Blogs 
2  blog  programming Programming blog 1 
3  tagsearch tags        2 
4  post  hello-world Hello World!  2 

我可以用Sq l服務器的hierarchyid類型(特別是第1點,「/ blogs/programming/tags」是最後一個有效的項目)?
樹深通常會在3-4左右。

什麼是實現所有這一切的最佳方法?

回答

1

你這樣做似乎罰款的方式,你可以利用的CTE遞歸函數來創建層次您

喜歡的東西

DECLARE @ITEM TABLE(
     id INT, 
     type VARCHAR(20), 
     slug VARCHAR(50), 
     title VARCHAR(50), 
     parentId INT 
) 

INSERT INTO @ITEM SELECT 1,'area','blogs','Blogs', NULL 
INSERT INTO @ITEM SELECT 2,'blog','programming','Programming blog',1 
INSERT INTO @ITEM SELECT 3,'tagsearch','tags',',',2 
INSERT INTO @ITEM SELECT 4,'post','hello-world','Hello World!',2 

;WITH Items AS (
     SELECT *, 
       CAST('/' + slug + '/' AS VARCHAR(50)) PathVal 
     FROM @ITEM 
     WHERE parentId IS NULL 
     UNION ALL 
     SELECT i.*, 
       CAST(Items.PathVal + i.slug + '/' AS VARCHAR(50)) 
     FROM Items INNER JOIN 
       @ITEM i ON i.parentId = Items.ID 
) 

SELECT * 
FROM Items