当人们有多个工作岗位时,使用人员,职位和团队为组织建模的最佳方法是什么?

leo*_*ora 9 database-design modeling data-modeling orgchart

我有一个有趣的建模问题.我正在尝试在网站上生成组织结构图(后端是C#/ SQL服务器,前端是javascript/google orgchart API,但建模问题的关键是更通用,所以我没有包含任何特定的技术下面的标签,因为问题不是任何技术特定问题.

我有以下4个数据库表:

  1. 团队 - 其中包含字段Id,Name,ParentTeamId(这是同一个表中的另一行)
  2. 职位 - 代表团队中的职位.字段是Id,TeamId,IsTeamHead等
  3. Person - 代表一个人(此表中没有与任何其他表的链接).字段是Id,FirstName,LastName等
  4. PersonPosition - 表示位置中的人(这将桥接两个表)字段是Id,PersonId,PositionId,StartDate,EndDate

当我有一个简单的vanilla org图表时,这非常有效,因为我基本上遍历每个团队(因为每个团队都有其ParentTeamId)并建立一个团队层次结构并显示该团队中的位置(使用TeamId字段)"Ishead"= true并将与该位置相关联的人显示为头部.

我的问题是(并非如此罕见),现在有人承担了多重责任 - 他们基本上有两个不同的工作.以前,乔是市场营销负责人,比尔是区域主管,但乔离开了

在营销负责人和区域主管之前,这是两个不同的(2个不同的职位)所以比尔是营销主管,但也是美国的区域经理.我试图找出建模和可视化的正确方法.

建模问题的第一部分是决定我是否应该将其建模为两个不同的位置.如果我这样做,我可以在这个PersonPosition表中有多个条目(两个都有相同的PersonId),但问题是我觉得我在计算位数.

此外,从可视化的角度来看,同一个人会出现在两个地方.也许这从功能的角度来看是正确的,但似乎奇怪的是你会多次列出同一个人(也许它不是那么奇怪,但想得到反馈,人们在这种情况下看到的是预期的可视化和什么似乎可以接受也许应该推动建模)

有什么建议"正确"的方式来做到这一点?

Bra*_*vic 11

看起来你需要类似的东西:

在此输入图像描述

在所有可能的位置"类型"(Position)中,我们构建一组存在于特定团队(TeamPosition)中的位置,并识别填充每个位置的人(TeamPosition.PersonId1).

头部由"逆向"外键FK2代表Team2.与布尔标志不同,这自然地确保每个团队不能有多个头部位置.

该模型还允许不同的团队由不同类型的职位领导:例如,一个团队可能由"营销负责人"领导,而另一个团队由"高级技术官员"领导.

根据我的理解,仍然可以让同一个人完成多个位置(包括头部位置),这符合您的要求.如果这是真的,那么我真的没有看到在UI中显示同一个人作为多个团队的成员的问题.或者,你可以指定一个人的位置为"主要"(使用类似于上面的"反向"FK),然后只显示主要位置和旁边的"更多......"按钮(或类似).


1如果没有空缺的球队位置,请将其设为非空.如果每个团队可以多次存在相同的位置,则移动PersonIdTeamPositionPK,或者向PK添加新字段PositionNo.如果同一个人不能在同一个团队中拥有多个职位,请添加备用密钥{TeamId, PersonId}.

2遗憾的是,MS SQL Server比其他一些DBMS更加娇气,并且拒绝对像这样的循环引用执行引用操作(例如ON DELETE CASCADE).如果需要参考操作,请通过INSTEAD OF触发器实现它们.


Chr*_*xon 1

正如您所说,员工通常(正式或非正式)在组织内扮演多个角色。然而,就人力资源/工资/其他管理部门而言,一名员工只会正式担任一个职位。保持这一点很重要,以确保人们不会得到两次报酬或其他过高/过低的报酬等。

您可以通过hr/admin_position向表中添加列来强制执行此操作person。然后可以使用该person_position表来记录他们实际扮演的所有角色。

这还允许为人们分配一个“组织结构图”职位,该职位与人力资源部门认为他们所执行的职位不同。当团队领导离开时,这种情况经常发生;团队中的一名初级成员将被“晋升”为临时团队领导,承担额外的责任。然而,工资或其他福利并没有相应增加,因为人力资源部门仍然认为他们从事的是初级职位。您可以添加额外的列以包含注释或标志以指示这些是临时位置。