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

时间:2011-03-07 16:38:43

标签: sql

我正在尝试在SQL中存储分层树。在我的情况下,同一个儿子可以有很多父亲(树代表VLSI设计,其中相同的细胞可以在不同的设计中多次使用)。 我在网上找到的所有模型都描述了每个员工都有一名经理的员工/经理关系。在我的情况下,父亲的数量可能非常大,如果我尝试将所有这些存储在表字段中,它们可能会超出字段的字符限制。 谁能建议一种更好的方法来存储这棵树?

谢谢,

梅尔

6 个答案:

答案 0 :(得分:1)

使用链接表。我会假设你在谈论人,并会使用那种白话。

你有一个person_table列出所有人及其各自的身份证明。然后你有一个father_son_table来描述每个人之间的联系。例如

person_table

id   |   Name
1    |   Matthew
2    |   Mark
3    |   Luke
4    |   John

说马修是马克的父亲,马克是卢克和约翰的父亲。在father_son_table中你会得到:

father_son_table

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

在这里,您可以根据需要定义尽可能多的父亲和儿子。

答案 1 :(得分:1)

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

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_MANAGERS_TABLE将为每个employee_manager关系包含一行。

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

答案 2 :(得分:1)

  

父亲的数量可能非常大,如果我尝试将所有这些存储在一个表格字段中

是吗?如果您尝试在同一字段中放置多个值,则不会对您的数据进行标准化。

虽然你说它的层次结构通常意味着一个节点有一个'父'和0个或更多的后代。如果情况并非如此,则不是分层数据模型 - 它是M:N关系。

或者您的意思是每个节点存在于多个层次结构中吗?

除非您提供对记录之间关系的准确描述,否则回答的问题是不可能的。

答案 3 :(得分:0)

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

http://www.amazon.com/Joe-Celkos-SQL-Smarties-Programming/dp/1558605762

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

答案 4 :(得分:0)

我会选择包含father_idson_id列的其他多对多连接表。

答案 5 :(得分:0)

您可能想要考虑针对此表最常运行的查询。根据层次结构的使用方式,存储层次结构的不同策略具有优点/缺点。

此外,任何用于存储层次结构的单父策略都可以通过简单地将树的每个元素视为指针来适应多个父元素。不同父母的指针可以指向相同的记录。