数据库层次结构 - 不同的节点表示

时间:2014-12-15 13:36:16

标签: mysql database database-design hierarchical-data

我正在寻找关于在关系数据库中建立层次结构的一些反馈/指导。我的要求声明我需要一个树结构,树中的每个节点都可以表示不同类型的数据。例如:

  • 组织
    • 部门1
      • 员工1
      • 员工2
      • 办公设备1
      • 办公设备2
    • 部门1
      • 第1队
    • 办公设备3

在上面的示例中,组织,部门,员工,办公设备和团队都可以是数据库中的不同表,并具有与之关联的不同属性。此外,诸如办公设备之类的东西可能不一定需要与部门相关联 - 它可以与团队或组织相关联。

我有两个关于建模的想法:

第一个想法是建立一个如下所示的层次结构表:

  

hierarchys

     

hierarchy_id(INT,NOT NULL)

     

parent_hierarchy_id(INT,NOT NULL)

     

organization_id(INT,NULL)

     

department_id(INT,NULL)

     

team_id(INT,NULL)

     

office_equipment(INT,NULL)

在上表中,每个列都是一个可空字段,其外键引用了它们可敬的表。我们的想法是,每行只会填充一列。

我的第二个想法是有一个如下表所示:

  

hierarchys

     

hierarchy_id(INT,NOT NULL)

     

parent_hierarchy_id(INT,NOT NULL)

     

type(INT,NOT NULL)

在这种情况下,上面的表将管理层次结构,并且每个“节点表”将具有hierarchy_id,其将具有返回到层次表的外键引用(即,组织将具有hierachy_id列)。 type列将是一个查找,表示正在表示的类型节点(即组织,员工等)。

我看到两种方法都有利有弊。

其他一些信息:

  • 我想记住这个表的可维护性 - 会有添加,删除,更改等。
  • 我必须在用户界面上显示这些数据,这可能只显示一个图标来表示节点类型和名称。
  • 我将不得不在树中为不同的数据请求执行一些聚合。
  • 此结构将由MySQL数据库支持。

有没有人有类似场景的经验?我已经搜索了很多关于这种方法的信息和指导,但是还没有找到任何信息。我觉得我正在寻找的是一个特定的术语,我没有使用它。

提前感谢社区的帮助。

2 个答案:

答案 0 :(得分:0)

我在不同的项目中遇到过类似的情况,我在这些情况下采取的方法与你的第二个解决方案非常相似。

我对一些Ruby on Rails宝石的做法有点偏向,但你可以很容易地弄清楚如何用纯SQL和一些应用程序逻辑来实现这些技术。所以我给你一个解决方案的替代方案:

使用"多表继承" (在遗产中实施:https://github.com/dipth/Heritage)。在这种情况下,您将拥有一个Node表,它构成了您的层次结构的基础:

Node (id, parent_node_id, heir_type, heir_id)

其中heir_type是包含节点详细信息的表的名称(例如,组织,员工,团队等),而heir_id是该表中对象的id。

然后,每种类型的节点都拥有它自己的表,并且它拥有自己唯一的ID。 e.g:

Organization(id, name, address)

使其余表独立于层次结构(即强实体),使您的模型对新添加更加灵活。还有一个单独的表,它有自己唯一的id来处理层次结构,这使得更容易渲染层次结构而不必处理父类型等。这个模型也更灵活,因为一个实体可以是许多不同分支的一部分。层次结构(例如,员工1可以同时是第1组和第2组的成员。)

您的解决方案有一个错误:hierarchys拼写错误:P JK。 hierarchyys表没有唯一的id。看起来唯一ID是复合键(hierarchy_id, type)parent_hierarchy_id不捕获父类型,因此可能指向多个节点和许多不一致。

如果您希望我详细说明,请告诉我。

答案 1 :(得分:0)

您可能想要查看“嵌套集”。这是一个用两个极限表示有序集子集的模型,我们称之为“左”和“右”。在这个模型中,(6,7)是(5,10)的子集,因为它是“嵌套”在它内部的。如果您使用嵌套集以及为层次结构设置单独表的设计,则最终会在层次结构表中使用四列:leftID,rightID,ObjectID(FK)和级别。

维基百科中的嵌套集模型有很好的描述,您可以通过clicking here查看。