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

前端之家收集整理的这篇文章主要介绍了数据库设计 – 当人们有多个工作岗位时,使用人员,职位和团队为组织建模的最佳方法是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个有趣的建模问题.我正在尝试在网站上生成组织结构图(后端是C#/ sql服务器,前端是 javascript / google orgchart API,但建模问题的关键是更通用,所以我没有包含任何特定的技术下面的标签,因为问题不是任何技术特定问题.

我有以下4个数据库表:

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

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

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

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

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

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

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

解决方法

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

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

头部由Team2中的“反向”外键FK2表示.与布尔标志不同,这自然地确保每个团队不能有多个头部位置.

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

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

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

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

猜你在找的MsSQL相关文章