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

标签 mysql database database-design hierarchical-data

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

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

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

围绕此建模我有两个想法:

第一个想法是有一个像下面这样的层次结构表:

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)

在上表中,每一列都是一个可以为 null 的字段,并带有对其相关表的外键引用。这个想法是每一行中只有一列会被填充。

我的第二个想法是有一个像下面这样的单一表格:

hierarchys

hierarchy_id (INT, NOT NULL)

parent_hierarchy_id (INT, NOT NULL)

type (INT, NOT NULL)

在这种情况下,上面的表将管理层次结构,每个“节点表”都有一个 hierarchy_id,它有一个指向层次表的外键引用(即组织会有一个 hierachy_id 列)。类型列将是一个查找,以表示正在表示哪种类型的节点(即组织、员工等)。

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

一些附加信息:

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

有没有人遇到过类似的情况?我已经搜索了很多关于这种方法的信息和指导,但一直找不到任何信息。我感觉有一个特定的术语来表示我正在寻找的东西,但我没有使用。

提前感谢社区的帮助。

最佳答案

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

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

关于mysql - 数据库层次结构 - 不同的节点表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27485341/

相关文章:

c# - 我将创建一个程序用条形码检查库存,我需要学习什么

c# - 读取和保存到数据库的提示

php - 使用 PDO 和 PHP 执行顺序语句的更好解决方案

php - 如何使用 Eloquent Query Builder 对与同一张表的关系使用 whereHas?

mysql - 计算与unix时间戳的不同间隔匹配的行数(MYSQL)

database - BCNF分解算法讲解

database-design - 在数据库中存储主动更新的字段

mysql - 这张 table 如何设计比较好呢?

mysql - mysql有没有办法允许2个外键中的1个为空?

python - Pandas:上传到 mysql 表