Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用外键表示SQL表中的二叉树_Sql_Database_Postgresql_Foreign Keys_Binary Tree - Fatal编程技术网

使用外键表示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

这是SQL表中二叉树表示的示例:

     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——这就是当前实现最佳的原因。事实上,我想要孩子而不是父母有点道理,因为结构是由要解决的问题定义的,而不是相反。问题应该是:我有一个用当前模型无法解决的问题(这里的描述)。我应该如何更改模型?这是否回答了您的问题?