我正在寻找关于在关系数据库中建立层次结构的一些反馈/指导。我的要求声明我需要一个树结构,树中的每个节点都可以表示不同类型的数据。例如:
在上面的示例中,组织,部门,员工,办公设备和团队都可以是数据库中的不同表,并具有与之关联的不同属性。此外,诸如办公设备之类的东西可能不一定需要与部门相关联 - 它可以与团队或组织相关联。
我有两个关于建模的想法:
第一个想法是建立一个如下所示的层次结构表:
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列将是一个查找,表示正在表示的类型节点(即组织,员工等)。
我看到两种方法都有利有弊。
其他一些信息:
有没有人有类似场景的经验?我已经搜索了很多关于这种方法的信息和指导,但是还没有找到任何信息。我觉得我正在寻找的是一个特定的术语,我没有使用它。
提前感谢社区的帮助。
答案 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查看。