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

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

UPDATE

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

Ответы [ 2 ]

3 голосов
/ 19 марта 2009

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

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
1 голос
/ 19 марта 2009

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

Celko также написал " Деревья и иерархии в SQL для Smarties ", в которых более подробно рассказывается о модели вложенных множеств и других решениях. Чтение этой книги сэкономит вам много времени и много ошибок.

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

...