我不知道我的树会有多深。所以我认为 NSM 适合我,阅读一些文档。在 sql 中,此模型假设我使用整数值作为主键。我想创建一个双表只是为了存储通过与真实表一对一的关系连接的整数(PK,左,右)。事情变得复杂而且浪费空间磁盘,特别是当服务器不是我的并且我必须支付每兆字节时。帮助!!
更新
优秀的!太棒了!谢谢 Macka 和 Bill,我现在可以跳过阅读整本书。Celko 是亚马逊的未来订单。;-)
我不知道我的树会有多深。所以我认为 NSM 适合我,阅读一些文档。在 sql 中,此模型假设我使用整数值作为主键。我想创建一个双表只是为了存储通过与真实表一对一的关系连接的整数(PK,左,右)。事情变得复杂而且浪费空间磁盘,特别是当服务器不是我的并且我必须支付每兆字节时。帮助!!
更新
优秀的!太棒了!谢谢 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 还为 Smarties 编写了“SQL 中的树和层次结构”,其中更详细地介绍了嵌套集模型和其他解决方案。读这本书会为你节省很多时间和很多错误。
还有其他将分层数据存储在数据库中的解决方案。在这里查看我的答案: 将平面表解析为树的最有效/优雅的方法是什么?