【发布时间】:2015-06-08 01:04:05
【问题描述】:
我是 SQL 新手,希望得到有关以下问题的任何帮助。我有以下代码为节点和树创建表,但不确定如何在我的代码中实现以下规则。
create table Node(
NodeId int not null,
ParentId int null,
NodeName varchar(255) not null,
constraint PK_Node primary key(NodeId),
constraint UK_NodeName unique(NodeName)
)
go
create table Tree(
NodeId int not null,
ParentId int not null,
Level int not null,
constraint PK_Tree primary key(NodeId, ParentId),
constraint UK_Level unique(NodeId, Level)
)
go}
alter table Node
add constraint FK_NodeNode foreign key(ParentId) references Node(NodeId) --on delete cascade;
alter table Tree
add constraint FK_NodeTreeNode foreign key(NodeId) references Node(NodeId) on delete cascade;
想象一个具有以下属性的树结构:
- a) 单根节点
- b) 每个节点可能有多个子节点
- c) 不能删除节点
- d) 所有非根节点都有一个属性 max children nodes - 新节点默认为固定默认值
- e) 可以随时更改最大子节点属性 - 如果新值小于当前子节点数,则子节点将按照沿途所有节点的属性沿链向上分布。如果该属性设置为零,则该节点将成为根节点的直接子节点
- f) 添加新节点时,它会添加到尽可能接近根级别的节点,按填充的子节点百分比配额升序排列。如果所有节点都达到了配额,则将其直接置于根节点之下。
创建表和索引来存储这些信息和过程,以尽可能高效地执行以下操作:
- i.向树中添加节点
- 二。更改节点的最大子节点属性
【问题讨论】:
-
我不确定如何设置列出的约束(比如节点可能不会被删除)。像我可以以某种方式在表创建中定义这些约束吗?
-
防止删除通常是通过触发器完成的。
-
老实说,我昨天开始使用 SQL,所以我所拥有的是我使用 google 和阅读其他论坛的结果。我对外键一无所知。我认为 ParentId 不应该为空。
标签: sql sql-server tree nodes