在SQL中存储层次结构树,其中每个子可以有多个父

在SQL中存储层次结构树,其中每个子可以有多个父,sql,Sql,我试图在SQL中存储一个层次结构树。在我的例子中,同一个儿子可以有许多父亲(这棵树代表了一种VLSI设计,在这种设计中,相同的单元可以在不同的设计中多次使用)。 我在网上找到的所有模型都描述了员工与经理的关系,每个员工都有一个经理。在我的例子中,父亲的数量可能相当大,如果我尝试将所有父亲存储在表字段中,他们可能会超过字段的字符限制。 有谁能推荐一种更好的方法来储存这棵树吗 谢谢 Meir使用链接表。我假设你说的是人,并且会用那种方言 您有一个person_表,列出了所有人及其各自的id。然后有一

我试图在SQL中存储一个层次结构树。在我的例子中,同一个儿子可以有许多父亲(这棵树代表了一种VLSI设计,在这种设计中,相同的单元可以在不同的设计中多次使用)。 我在网上找到的所有模型都描述了员工与经理的关系,每个员工都有一个经理。在我的例子中,父亲的数量可能相当大,如果我尝试将所有父亲存储在表字段中,他们可能会超过字段的字符限制。 有谁能推荐一种更好的方法来储存这棵树吗

谢谢


Meir使用链接表。我假设你说的是人,并且会用那种方言

您有一个person_表,列出了所有人及其各自的id。然后有一个父子表,描述每个人之间的链接。例如

人名表

id   |   Name
1    |   Matthew
2    |   Mark
3    |   Luke
4    |   John
假设马修是马克的父亲,马克是路加和约翰的父亲。在父子表中,您可以:

父子桌

id    | father_id | son_id
1     | 1         | 2
2     | 2         | 3
3     | 2         | 4

在这里,您可以定义任意数量的父亲和儿子。

使用链接表。我假设你说的是人,并且会用那种方言

您有一个person_表,列出了所有人及其各自的id。然后有一个父子表,描述每个人之间的链接。例如

人名表

id   |   Name
1    |   Matthew
2    |   Mark
3    |   Luke
4    |   John
假设马修是马克的父亲,马克是路加和约翰的父亲。在父子表中,您可以:

父子桌

id    | father_id | son_id
1     | 1         | 2
2     | 2         | 3
3     | 2         | 4

在这里,您可以定义任意数量的父亲和儿子。

您可以在乔·塞尔科的书中找到一些巧妙的树木处理方法:


…然而,我不知道它是否涵盖了您的问题

您在Joe Celko的书中找到了一些处理树的聪明方法:


…但是,我不知道它是否涵盖了您的问题

在关系数据库中存储此关系的一种可能方法是创建两个表-EMPLOYEE\u表和EMPLOYEE\u MANAGERS\u表

create table EMPLOYEE_TABLE(
  emp_id number, 
  emp_name varchar(200),

  primary key(emp_id)
)


create table EMPLOYEE_MANAGERS_TABLE (
  id number,
  emp_id number, 
  manager_id number,

  primary key(id),
  foreign key(emp_id) references employee_table(emp_id),
  foreign key(manager_id) references employee_table(emp_id)
)
EMPLOYEE_manager_表将为每个EMPLOYEE_manager关系包含一行


您可以应用相同的模式来存储父子关系,其中一个儿子可以有多个父亲。

在关系数据库中存储此关系的一种可能方法是创建两个表-EMPLOYEE\u表和EMPLOYEE\u MANAGERS\u表

create table EMPLOYEE_TABLE(
  emp_id number, 
  emp_name varchar(200),

  primary key(emp_id)
)


create table EMPLOYEE_MANAGERS_TABLE (
  id number,
  emp_id number, 
  manager_id number,

  primary key(id),
  foreign key(emp_id) references employee_table(emp_id),
  foreign key(manager_id) references employee_table(emp_id)
)
EMPLOYEE_manager_表将为每个EMPLOYEE_manager关系包含一行


您可以应用相同的模式来存储父子关系,其中一个儿子可以有多个父亲。

我将使用
父子id
父子id
列来创建其他多对多连接表。

我将使用
父子id
父子id
列。

您可能想考虑哪些查询将最频繁地运行到此表中。根据层次结构的使用方式,存储层次结构的不同策略有其优缺点


此外,任何用于存储层次结构的单亲策略都可以通过将树的每个元素作为指针来处理多个双亲。在不同的父代下的指针可以指向同一条记录。

您可能想考虑对这个表运行最频繁的查询。根据层次结构的使用方式,存储层次结构的不同策略有其优缺点

此外,任何用于存储层次结构的单亲策略都可以通过将树的每个元素作为指针来处理多个双亲。不同父项下的指针可以指向同一记录

父亲的数量可能相当大,如果我尝试将所有父亲都存储在表字段中

嗯??如果试图在同一字段中输入多个值,则数据不会正常化

虽然您说它是分层的,但这通常意味着一个节点有一个“父节点”和0个或更多子节点。如果不是这样,那么它就不是一个层次数据模型——它是一个M:N关系

还是说每个节点都存在于多个层次结构中

除非您提供记录之间关系的准确描述,否则无法回答此问题

父亲的数量可能相当大,如果我尝试将所有父亲都存储在表字段中

嗯??如果试图在同一字段中输入多个值,则数据不会正常化

虽然您说它是分层的,但这通常意味着一个节点有一个“父节点”和0个或更多子节点。如果不是这样,那么它就不是一个层次数据模型——它是一个M:N关系

还是说每个节点都存在于多个层次结构中


除非您提供记录之间关系的准确描述,否则无法回答此问题。

树有多深?只有两个,父亲和儿子,或者你有孙子级别,也可以是多亲?另一种方法是把它看作是倒挂的树或者从儿子的一边做连接扇子(如果你明白我的意思)?编辑:事实上,你是在存储一个图形,而不是一棵树吗?这棵树有多深?只有两个,父亲和儿子,或者你有孙子级别,也可以是多亲?另一种方法是把它看作是倒挂的树或者从儿子的一边做连接扇子(如果你明白我的意思)?编辑:事实上,你是在存储一个图形,而不是一棵树吗?Celko有一本关于树和层次结构的书:Celko有一本关于树和层次结构的书:谢谢你的建议!我会尝试使用这种方法,因为它似乎最适合我的需要。谢谢你的建议!我将尝试使用这种方法,因为它似乎最适合我的需要。