使用外键表示SQL表中的二叉树
这是SQL表中二叉树表示的示例:使用外键表示SQL表中的二叉树,sql,database,postgresql,foreign-keys,binary-tree,Sql,Database,Postgresql,Foreign Keys,Binary Tree,这是SQL表中二叉树表示的示例: A node | parent / \ A | NULL / \ B | A / \ C | A B C
A node | parent
/ \ A | NULL
/ \ B | A
/ \ C | A
B C D | B
| / \ E | C
| / \ F | C
D E F
正如您所看到的,表树有两列:node是主键,parent是外键。在每个节点中存储对其父节点的引用。
我想定义同一棵树,但是这次使用子节点,每个节点应该引用它的子节点。
你知道怎么做吗?你会有一个有三列的表格。一个表示节点的标识符,两个表示其子节点的标识符。所以基本上是这样的:
CREATE TABLE bintree
(id integer,
left integer,
right integer,
PRIMARY KEY (id),
FOREIGN KEY (left)
REFERENCES bintree
(id),
FOREIGN KEY (right)
REFERENCES bintree
(id));
可能还有一个检查约束,它检查
left
不等于right
,还有一个(约束)触发器,它检查事物是否保持无循环…您将有一个包含三列的表。一个表示节点的标识符,两个表示其子节点的标识符。所以基本上是这样的:
CREATE TABLE bintree
(id integer,
left integer,
right integer,
PRIMARY KEY (id),
FOREIGN KEY (left)
REFERENCES bintree
(id),
FOREIGN KEY (right)
REFERENCES bintree
(id));
可能还有一个检查约束,它检查
左
不等于右
,还有一个(约束)触发器,它检查对象是否保持无循环…或者,您也可以使用两个表来定义树的弧
例如:
A Table: Nodes Table: Arcs
/ \ node parent | child
/ \ A A | B
/ \ B A | C
B C C B | D
| / \ D C | E
| / \ E C | F
D E F F
这样,父级可以与零个、一个或多个子级关联
执行此操作的SQL脚本是:
create table nodes (
id varchar(10) primary key not null
);
create table arcs (
parent varchar(10) not null,
child varchar(10) not null,
constraint uq1 unique (parent, child), -- optional
foreign key (parent) references nodes (id),
foreign key (child) references nodes (id)
);
或者,您也可以使用两个表以弧的形式定义树 例如:
A Table: Nodes Table: Arcs
/ \ node parent | child
/ \ A A | B
/ \ B A | C
B C C B | D
| / \ D C | E
| / \ E C | F
D E F F
这样,父级可以与零个、一个或多个子级关联
执行此操作的SQL脚本是:
create table nodes (
id varchar(10) primary key not null
);
create table arcs (
parent varchar(10) not null,
child varchar(10) not null,
constraint uq1 unique (parent, child), -- optional
foreign key (parent) references nodes (id),
foreign key (child) references nodes (id)
);
嗯,你可以将列
节点
重命名为子节点
,将列父节点
重命名为节点
,否则我会丢失一些东西?@GMB存储单个节点树会很尴尬,包含根节点
但无子节点
——这是唯一一种显式存储无子节点的情况。@Bergi——这就是当前实现最佳的原因。事实上,我想要孩子而不是父母有点道理,因为结构是由要解决的问题定义的,而不是相反。问题应该是:我有一个用当前模型无法解决的问题(这里的描述)。我应该如何更改模型?这是否回答了您的问题?嗯,你可以将列节点
重命名为子节点
,将列父节点
重命名为节点
,否则我会丢失一些东西?@GMB存储单个节点树会很尴尬,包含根节点
但无子节点
——这是唯一一种显式存储无子节点的情况。@Bergi——这就是当前实现最佳的原因。事实上,我想要孩子而不是父母有点道理,因为结构是由要解决的问题定义的,而不是相反。问题应该是:我有一个用当前模型无法解决的问题(这里的描述)。我应该如何更改模型?这是否回答了您的问题?