2009-03-19 20 views
2

Je ne suis pas conscient à quelle profondeur mon arbre sera. Donc, je pense que le NSM est bon pour moi, en lisant quelques docs. En sql, ce modèle suppose que j'utilise une valeur entière comme clé primaire. Je pensais créer une table jumelle uniquement pour stocker les ints (PK, left, right) connectés par une relation bi-univoque avec la table réelle. Les choses se compliquent et c'est un gaspillage de disque spatial, surtout quand le serveur n'est pas à moi et que je dois payer chaque mégaoctet. Aidez-moi!!Je voudrais utiliser le "modèle de jeu imbriqué" mais je suis obligé d'avoir un GUID comme clé primaire. Comment puis-je faire sans entiers comme pk?

MISE À JOUR

Excellent! Fabolous !! Merci Macka et Bill, je pourrais passer la lecture d'un livre entier, pour le moment. Celko est une future commande sur Amazon. ;-)

+0

Qu'est-ce que NSM? Et également spécifieriez-vous quelle version du serveur SQL vous exécutez à nouveau? – Sung

+1

NSM = Modèle de jeu imbriqué - voir le post de Joe Celko ici: http://www.intelligententerprise.com/001020/celko.jhtml – BigJump

+0

@Macka: merci. le temps d'apprendre de nouvelles choses.! – Sung

Répondre

3

Peu importe le type de votre clé primaire car les valeurs gauche/droite seront toujours des entiers. par exemple.

CREATE TABLE [dbo].[Demo](
    [ID] [uniqueidentifier] ROWGUIDCOL NOT NULL CONSTRAINT [DF_Demo_ID] DEFAULT (newid()), 
    [Name] [varchar](50) NOT NULL, 
    [Lft] [int] NOT NULL, 
    [Rgt] [int] NOT NULL, 
CONSTRAINT [PK_Demo] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

--AJOUTEZ des données de test

INSERT INTO demo(name,lft,rgt) 
SELECT 'node1',1,6 
UNION 
SELECT 'node2a',2,3 
UNION 
SELECT 'node2b',4,5 

--check cela fonctionne

SELECT * 
FROM demo 
WHERE lft>=2 
ORDER BY lft 
+0

merci Macka. Je vais faire une requête avec de fausses données. Avez-vous des liens où je peux trouver une implémentation? Je suis frais avec NSM, j'ai besoin d'améliorer mes connaissances à ce sujet .. –

+0

Je vais juste ajouter que vous voulez vous assurer que vous avez des contraintes appropriées sur vos colonnes. Par exemple, si vous n'allez pas utiliser un PK sur lft et rgt au moins ajouter un index unique sur lui et aussi ajouter une contrainte de vérification que lft

+0

Joe Celko (qui a conçu cela) a écrit un livre appelé SQL pour Smarties couvre cela et d'autres façons cool de stocker des données - def. recommande que. Commencez ici http://www.intelligententerprise.com/001020/celko.jhtml et après cela une recherche Google pour 'Joe Celko' devrait vous avoir trié. Bonne chance! – BigJump

1

Comme @Macka writes, la gauche et à droite ne sont pas les clés étrangères aux nœuds d'arbres, ils n'ont donc pas besoin d'être du même type. Ils peuvent être des entiers tandis que la clé primaire du nœud d'arbre est un GUID.

Celko a également écrit "Trees and Hierarchies in SQL for Smarties" qui va plus en détail sur le modèle de jeu imbriqué, et d'autres solutions. La lecture de ce livre vous fera économiser beaucoup de temps et beaucoup d'erreurs.

Il existe d'autres solutions pour stocker des données hiérarchiques dans une base de données. Voir ma réponse ici: What is the most efficient/elegant way to parse a flat table into a tree?