不同的节点表示

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

  • 组织
  • 部门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)

    类型(INT,NOT NULL)

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

    我看到两种方法的优点和缺点。

    一些额外的信息:

  • 我想牢记这张表的可维护性 - 会有增加,删除,更改等。
  • 我将不得不在用户界面上显示这些数据,这可能只是显示一个图标来表示节点类型和名称。
  • 我将不得不在树上针对不同的数据请求进行一些聚合。
  • 这个结构将由MySQL数据库支持。
  • 有没有人有类似的情况下的经验? 我已经搜索了很多关于这种方法的信息和指导,但一直未能找到任何信息。 我有一种感觉,对于我所寻找的我没有使用的具体术语。

    提前感谢您的帮助。


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

    维基百科中的嵌套集模型有很好的描述,您可以点击这里查看。


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

    我对Ruby on Rails宝石的做法也有点偏见,但是您可以轻松弄清楚如何用普通的SQL和一些应用程序逻辑来实现这些技术。 所以我给你一个解决方案的替代方案:

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

    Node (id, parent_node_id, heir_type, heir_id)
    

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

    然后每种类型的节点都有它自己的表格,并且它是自己的唯一ID。 例如:

    Organization(id, name, address)
    

    让其余的表独立于层次结构(即强大的实体),使得您的模型对于新增加的元素更加灵活。 还有一个独立的表格和自己的唯一ID来处理层次结构,使得更容易呈现层次结构而无需处理父类型等。这种模式也更灵活,因为一个实体可以成为许多不同分支的一部分层次结构(例如,员工1可以同时成为团队1和团队2的成员)。

    你的解决方案有一个错误: hierarchys是拼写错误的:P JK。 层次结构表没有唯一的ID。 它看起来像唯一的ID是一个组合键(hierarchy_id, type)parent_hierarchy_id不捕获父级的类型,因此它可能指向多个节点和许多不一致。

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

    链接地址: http://www.djcxy.com/p/35041.html

    上一篇: Different Node Representation

    下一篇: to N items capacity for a database