9

我有一个有趣的建模问题。我正在尝试在网站上生成一个组织结构图(后端是 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

当我有一个普通的香草组织结构图时,这很有效,因为我基本上循环遍历每个团队(因为每个团队都有其ParentTeamId)并建立一个团队层次结构并显示该团队中的位置(使用TeamId字段)与“Ishead” = true并将与该位置相关联的人显示为头部。

我的问题是(并不少见),有些人现在被赋予了多重责任——他们基本上有两种不同的工作。此前,乔是营销主管,比尔是区域主管,但乔离开了

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

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

此外,从可视化的角度来看,同一个人会出现在两个地方。从功能的角度来看,这可能是正确的,但您将多次列出同一个人似乎很奇怪(也许这并不奇怪,但希望获得有关人们在这种情况下所看到的预期可视化以及似乎可以接受的反馈也许应该推动建模)

对“正确”的方法有什么建议吗?

4

4 回答 4

11

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

在此处输入图像描述

在所有可能的职位“类型”(Position)中,我们建立了一组特定团队中存在的职位(TeamPosition),并确定了填补每个职位的人(TeamPosition.PersonId1)。

头部由Team2中的“反向”外键 FK2 表示。与布尔标志不同,这自然可以确保每个团队不能有超过一个头位。

该模型还允许不同的团队由不同类型的职位领导:例如,一个团队可能由“营销主管”领导,而另一个团队由“高级技术官”领导。

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


1如果不能有空缺的团队位置,则将其设为 NOT NULL。如果每个团队可以多次存在相同的位置,则将PersonId移至TeamPositionPK,或将新字段添加PositionNo到 PK。如果同一个人不能在同一团队中担任多个职位,请在 上添加备用键{TeamId, PersonId}

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

于 2013-04-09T23:56:41.700 回答
4

我认为您应该考虑“职位”和“角色”之间的区别。在许多组织中,可能存在多个角色:安全协调员、采购、应付账款、接待员……通常,尤其是在较小的组织中,一个人可能在不同的时间担任不同的角色。当他们以不同的身份行事时,甚至可能会向不同的人报告(例如,应急响应人员可能向安全协调员报告,但采购员向运营负责人报告。)

为了正确反映这些事情,数据库中的关系需要尽可能地反映现实生活中存在的关系。这可能意味着您将拥有多个表(就像您已经拥有的那样),但它会使事情保持清洁。

要记住的另一件事(可能值得在您的数据库中反映)是许多组织是矩阵式的:人们可能在某些项目团队中,并且是某些组织的一部分。电气工程师可能都向电气工程经理报告,但他们可能从事不同的项目/产品,因此属于不同的项目团队。

准确地捕捉所有这些是很困难的。这是我的建议(与您的建议不同,但有一些调整):

表 1:员工人名、员工 ID、开始日期、薪水、假期……
这个表格说明了您何时获得报酬、您有多少假期、您的“人力资源状况”是什么。你们只有一个人——这张桌子只有你们一个人,用于那些不能加倍的东西(尽管我们都想要两张支票)。

表 2:经理经理 ID、报告 ID、报告类型
该表针对每个经理说明了向他们报告的人员是谁,以及它们之间的关系类型。您可能有“主要”关系和其他关系:“项目负责人”、“团队负责人”……“主要”经理可能会根据“其他”经理的意见做出 HR 类型的决策。

表 3:团队团队名称、团队 ID、经理 ID、BelongsToTeam、团队描述……
描述每个“组织实体”的表,以及可能有用的任何辅助信息。BelongsToTeam 允许团队的层次结构,这有助于可视化。

表 4:角色角色名称、团队 ID、员工 ID、isPrimary
此表描述了谁是给定角色。具有多个角色的员工将多次出现在此表中,并且可能会根据他们的角色向不同的经理报告。我在这里添加了一个“isPrimary”字段 - 不确定这是否是多余的。从某种意义上说,如果您从表 4 中员工的“主要”角色开始,并找出表 3 中的团队经理是谁,那么您应该以表 2 中的人为主要经理结束......我担心如果你把它留在两个地方,你最终可能会出现不一致。

我相信以上内容可以让您描述几乎任何组织 - 通过允许表 4 中的“isPrimary”字段,甚至有可能作为您的“人力资源老板”的同一个人出现在您的“项目负责人”中第二个小组,甚至可能会在应急响应小组中向您报告...

至于可视化 - 使用上述结构有两种明显的方法可以做到这一点。第一个是“严格等级” - 只显示他们的主要经理下面的人。这是“人力资源组织结构图”,每个人只出现一次。

您可以拥有第二张“基于团队”的图表。现在,每个团队都有自己的组织,同一个人可以出现在多个团队中。这些团队如何相互关联可能很棘手 - 但原则上,表 3 应该提供您需要的 BelongsToTeam 字段。

我期待听到您对此的看法!

于 2013-04-09T23:57:21.900 回答
1

正如您所说,员工通常(正式或非正式地)在组织内履行多个角色。但是,就人力资源/工资单/其他管理部门而言,一名员工只会正式担任一个职位。重要的是要保持这一点,以确保人们不会获得两次报酬或以其他方式获得过高/过少的补偿等。

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

这也允许人们被分配一个与 HR 认为他们执行的不同的“组织结构图”职位。当团队负责人离开时,通常会发生这种情况;团队的一名初级成员将被“提升”为临时团队负责人,承担额外的责任。然而,工资或其他福利并没有相应的增加,因为 HR 仍然认为他们在做更初级的职位。您可以添加额外的列以包含注释或标志以指示这些是临时位置。

于 2013-04-07T15:01:38.980 回答
1

“建模问题的第一部分是决定我是否应该将其建模为两个不同的位置。如果这样做,我可以在此 PersonPosition 表中有多个条目(都具有相同的 PersonId)但问题在于感觉就像我多算了职位的数量。”

不,没有问题。您提到的问题是,如果有人想“计算职位数量”,但访问 personposition 表这样做,就会出错。由于不了解数据库、数据模型或其他什么,事情是:如果需要计算职位数,则需要访问职位表。

“另外,从可视化的角度来看,”

这里只是一个旁注,如果“可视化”是您的实际问题,那么数据库人员通常不会帮助您。

“同一个人会出现在两个地方。从功能的角度来看,这可能是正确的”

如果它是业务规则,那么它就是业务规则。通常不由你来质疑他们。如果不同的人共享同一个职位怎么办?例如,两个兼职人员各自做[他们的一半]同样的工作。

“但你会多次列出同一个人,这似乎很奇怪(也许这并不奇怪,但希望得到关于人们在这种情况下所看到的预期可视化以及似乎可以接受的内容可能应该推动建模的反馈)。”

嗯,你刚刚说了。如果这是商业规则,那并不奇怪。也许您以前从未遇到过这样的情况,但是谁在乎呢?

“对“正确”的方法有什么建议吗?

并不真地。您需要做的就是弄清楚要准确呈现哪些信息。所有现有职位,如果当前未占用,则名称为空?只有实际占据的职位,以及占据该职位的可能多人中的任何一个名字?等等等等

于 2013-04-10T14:55:30.637 回答