Sql I';I’我想用;嵌套集模型;但是我';我必须有一个GUID作为主键。没有整数作为pk怎么办?

Sql I';I’我想用;嵌套集模型;但是我';我必须有一个GUID作为主键。没有整数作为pk怎么办?,sql,sql-server,tree,nested,hierarchical-data,Sql,Sql Server,Tree,Nested,Hierarchical Data,我不知道我的树有多深。因此,我认为NSM适合我阅读一些文档。在sql中,这个模型假设我使用一个整数值作为主键。我认为创建一个双表只是为了存储整数(PK,left,righ),这些整数通过一对一的关系与实际表连接。事情很复杂,这是对磁盘空间的浪费,特别是当服务器不是我的,我必须支付每兆字节。救命 更新 好极了!难以置信的!!谢谢Macka和Bill,我现在可以不看整本书了。 Celko是亚马逊的未来订单。;-) 主键的类型无关紧要,因为左/右值仍然是整数。例如 CREATE TABLE [dbo]

我不知道我的树有多深。因此,我认为NSM适合我阅读一些文档。在sql中,这个模型假设我使用一个整数值作为主键。我认为创建一个双表只是为了存储整数(PK,left,righ),这些整数通过一对一的关系与实际表连接。事情很复杂,这是对磁盘空间的浪费,特别是当服务器不是我的,我必须支付每兆字节。救命

更新

好极了!难以置信的!!谢谢Macka和Bill,我现在可以不看整本书了。
Celko是亚马逊的未来订单。;-)

主键的类型无关紧要,因为左/右值仍然是整数。例如

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时,它们可以是整数

Celko还写了“”一文,详细介绍了嵌套集模型和其他解决方案。读这本书会节省你很多时间和很多错误

在数据库中存储分层数据还有其他解决方案。请看我的回答:

什么是NSM?另外,您是否还要指定您再次运行的SQL server的版本?NSM=嵌套集模型-请参阅Joe Celko的帖子:@Macka:Thanke。是时候学习新东西了。!谢谢你,麦卡。我要用假数据做一些查询。你有我可以找到实现的链接吗?我对NSM很熟悉,我需要提高我对它的了解。我只想补充一点,您希望确保对您的列有适当的约束。例如,如果您不打算在lft和rgt上使用PK,至少在其上添加一个唯一的索引,并添加一个检查约束,lft