不同的节点表示
我正在寻找关于建模关系数据库中层次结构的反馈/指导。 我的要求指出我需要有一个树形结构,树中的每个节点都可以表示不同类型的数据。 例如:
在上面的示例中,组织,部门,员工,办公设备和团队都可以是数据库中的不同表格,并具有与其关联的不同属性。 此外,像办公设备这样的东西可能不一定需要与部门相关联 - 它可以与团队或组织相关联。
我有两个关于建模的想法:
第一个想法是有如下的层次结构表:
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列)。 类型列将是查找来表示哪个类型节点被表示(即组织,雇员等)。
我看到两种方法的优点和缺点。
一些额外的信息:
有没有人有类似的情况下的经验? 我已经搜索了很多关于这种方法的信息和指导,但一直未能找到任何信息。 我有一种感觉,对于我所寻找的我没有使用的具体术语。
提前感谢您的帮助。
你可能想看看“嵌套集”。 这是一个用两个限制来表示有序集的子集的模型,我们可以将其称为“左”和“右”。 在这个模型中,(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