Я хотел бы использовать «вложенную модель набора», но я обязан иметь GUID в качестве первичного ключа. Как я могу обойтись без целых чисел, как PK?

StackOverflow https://stackoverflow.com/questions/662697

Вопрос

я не осведомленный Как глубоко будет мое дерево. Так что я думаю, что NSM подходит для меня, читая несколько документов. В SQL эта модель предполагает, что я использую целочисленное значение в качестве первичного ключа. Я подумал создать двойную таблицу только для хранения INT (PK, слева, Right), соединенного отношением один к одному с реальной таблицей. Все усложняет, и это пустая трата космического диска, особенно когда сервер не мой, и я должен платить каждый мегабайт. Помощь!!

ОБНОВИТЬ

Превосходно! Fabolous !! Спасибо, Мака и Билл, я мог пропустить чтение целой книги, пока. Celko - будущий порядок на Amazon. ;-)

Это было полезно?

Решение

Неважно, какой тип ваш основной ключ является, поскольку значения левого/правого по -прежнему будут целыми. например.

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]

-Добавьте некоторые тестовые данные

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

-проверьте, это работает

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

Другие советы

Как @macka пишет, левые и правые значения не являются иностранными ключами к узлам деревьев, поэтому они не должны быть такого же типа. Они могут быть целыми числами, в то время как основной ключ узла дерева является GUID.

Селко также написал "Деревья и иерархии в SQL для Smarties«Что касается более подробной информации о вложенной модели SET и других решениях. Чтение этой книги сэкономит вам много времени и много ошибок.

Существуют и другие решения для хранения иерархических данных в базе данных. Смотрите мой ответ здесь:Какой самый эффективный/элегантный способ разобрать плоский стол в дерево?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top