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 les entiers comme PK?
-
20-08-2019 - |
Question
je ne suis pas au courant Quelle sera la profondeur de mon arbre. Je pense donc que le NSM est apte à moi, en lisant certains documents. Dans SQL, ce modèle supposait que j'utilise une valeur entière comme clé primaire. J'ai pensé créer une table jumelle uniquement pour stocker les INTS (PK, gauche, droite) connectés par une relation un à un avec la vraie table. Les choses sont compliquées et c'est un gaspillage de disque d'espace, surtout lorsque le serveur n'est pas à moi et que je dois payer chaque mégaoctet. Aider!!
METTRE À JOUR
Excellent! Fabolous !! Merci Macka et Bill, je pourrais sauter en lisant un livre entier pour l'instant. Celko est une commande future sur Amazon. ;-)
La solution
Peu importe le type que votre clé principale est 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]
- Add quelques données de test
INSERT INTO demo(name,lft,rgt)
SELECT 'node1',1,6
UNION
SELECT 'node2a',2,3
UNION
SELECT 'node2b',4,5
- Vérifiez que cela fonctionne
SELECT *
FROM demo
WHERE lft>=2
ORDER BY lft
Autres conseils
Comme @macka écrit, les valeurs gauche et droite ne sont pas des clés étrangères aux nœuds d'arbre, ils n'ont donc pas à être le 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 "Arbres et hiérarchies en SQL pour les smart"Ce qui va plus en détail sur le modèle d'ensemble imbriqué et d'autres solutions. La lecture de ce livre vous fera gagner beaucoup de temps et beaucoup d'erreurs.
Il existe d'autres solutions pour stocker les données hiérarchiques dans une base de données. Voir ma réponse ici:Quel est le moyen le plus efficace / élégant pour analyser une table plate dans un arbre?