2010-04-02 5 views
3

Je souhaite stocker la hiérarchie de pages Web dans une table.Stockage de la hiérarchie de sites Web dans Sql Server 2008

Ce que je voudrais réaliser est efficacement
1) détermination (dernière valide) par élément chemin (par exemple « /blogs/programming/tags/asp.net,sql-server », «/blogs/programmation/bonjour -World »)
2) obtenir des objets ancêtres pour breadcrump
3) modifier un élément sans mettre à jour l'arbre entier des enfants, petits-enfants, etc.

en raison du 3ème point que je pensais que la table pourrait être comme

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 

Pourrais-je utiliser Sq l Le type hierarchyid du serveur (en particulier le point 1, "/ blogs/programming/tags" est le dernier élément valide)?
La profondeur de l'arbre serait habituellement d'environ 3-4.

Quel serait le meilleur moyen de réaliser tout cela?

Répondre

1

La façon dont vous avez fait cela semble bien, vous pouvez utiliser des fonctions récursives CTE pour créer la hiérarchie pour vous

Quelque chose comme

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