当人们拥有多项工作时,使用人员、职位和团队对组织进行建模的最佳方法是啥? [关闭]
Posted
技术标签:
【中文标题】当人们拥有多项工作时,使用人员、职位和团队对组织进行建模的最佳方法是啥? [关闭]【英文标题】:What is the best way to model an organization using people, positions and teams when people have multiple jobs? [closed]当人们拥有多项工作时,使用人员、职位和团队对组织进行建模的最佳方法是什么? [关闭] 【发布时间】:2013-03-29 13:59:45 【问题描述】:我有一个有趣的建模问题。我正在尝试在网站上生成一个组织结构图(后端是 C# / SQL 服务器,前端是 javascript / google orgchart API,但建模问题的症结更通用,所以我没有包含任何特定技术下面的标签,因为问题不涉及任何技术特定问题。
我有以下4个数据库表:
-
Team - 具有 Id、Name、ParentTeamId 字段(同一张表中的另一行)
职位 - 代表团队中的职位。字段为 Id、TeamId、IsTeamHead 等
Person - 代表一个人(此表中没有与任何其他表的链接)。字段为 Id、FirstName、LastName 等
PersonPosition - 代表职位上的人(这将两个表连接起来)字段是 Id、PersonId、PositionId、StartDate、EndDate
当我有一个普通的普通组织结构图时,这非常有效,因为我基本上循环遍历每个 团队(因为每个都有其 ParentTeamId)并建立一个团队层次结构并展示该团队中的 position(使用 TeamId 字段)且 "Ishead" = true 并将与该职位相关联的人显示为负责人。
我的问题是(并不少见),有些人现在被赋予了多重责任 - 他们基本上有两种不同的工作。此前,Joe 是营销主管,Bill 是区域主管,但 Joe 离开了
在市场营销主管和区域主管之前,这是 2 个不同的人(2 个不同的职位)所以 Bill 是市场营销主管,但也是区域经理美国。我正在尝试找出建模和可视化的正确方法。
建模问题的第一部分是决定我是否应该将其建模为两个不同的位置。如果我这样做了,我可以在这个 PersonPosition 表中有多个条目(都具有相同的 PersonId),但问题是我感觉好像我多算了职位数量。
此外,从可视化的角度来看,同一个人会出现在 2 个地方。从功能的角度来看,这可能是正确的,但您将多次列出同一个人似乎很奇怪(也许这并不奇怪,但希望获得有关人们在这种情况下所看到的预期可视化以及似乎可以接受的反馈也许应该推动建模)
对“正确”的方法有什么建议吗?
【问题讨论】:
【参考方案1】:看起来你需要类似的东西:
在所有可能的职位“类型”(Position
)中,我们建立了一组特定团队中存在的职位(TeamPosition
)并确定了填补每个职位的人(TeamPosition.PersonId
1 )。
头部由Team
2 中的“反向”外键 FK2 表示。与布尔标志不同,这自然可以确保每个团队最多有一个头位。
此模型还允许不同的团队由不同类型的职位领导:例如,一个团队可能由“营销主管”领导,而另一个团队由“高级技术官”领导。
据我了解,仍然可以让同一个人担任多个职位(包括头部职位),这符合您的要求。如果这是真的,那么我认为在 UI 中将同一个人显示为多个团队的成员并没有什么问题。或者,您可以将某人的位置指定为“主要”(使用类似于上面的“反向”FK),然后只显示主要位置和旁边的“更多...”按钮(或类似按钮)。
1 如果不能有空缺的团队位置,则将其设为 NOT NULL。如果同一位置可以在每个团队中多次存在,请将 PersonId
移动到 TeamPosition
PK,或者将新字段 PositionNo
添加到 PK。如果同一个人不能在同一团队中担任多个职位,请在 TeamId, PersonId
上添加备用键。
2 不幸的是,MS SQL Server 比其他一些 DBMS 更加娇气,并且会拒绝对这样的循环引用执行引用操作(例如 ON DELETE CASCADE)。如果您需要引用操作,请通过 INSTEAD OF 触发器实现它们。
【讨论】:
两天内没有关于这个问题的活动,然后一分钟内有两个答案...... @Branko - 我喜欢 positionteam 表的想法,因为它提供了灵活性,因为在某一时刻,一个位置在多个团队中,并且可能会随着时间而改变。我的一个问题是 99% 的职位只有一个团队。 .无论如何,您是否可以想到我只能管理具有多个的那些(而不必维护该表中其他 99% 的信息 @leore 如果您绝对肯定,随着数据库的增长,这种情况将继续存在,然后保留您的旧模型并在几个必要的地方重复位置(或者,我可以看到“混合”您的旧模型和我的模型之间可能看起来像,但这会使查询复杂化)。但是,这一切对我来说看起来有点不寻常...我不知道您要模拟哪个行业,但至少在 IT 中,有很多职位重复,例如“初级开发人员”、“高级开发人员”或“团队负责人”。其中许多职位不仅在团队之间重复,而且在同一团队内部重复。 @Branko - 在我的情况下,职位不是对角色或资历级别的描述。它只是代表一个人数,可能会或可能不会有一个人。【参考方案2】:“建模问题的第一部分是决定是否应该将其建模为两个不同的位置。如果这样做,我可以在此 PersonPosition 表中有多个条目(都具有相同的 PersonId),但问题是感觉好像我多算了职位的数量。”
不,没有问题。您提到的问题是,如果有人想“计算职位数”,但访问 personposition 表这样做,就会出错。由于不了解数据库、数据模型或其他什么,事情是:如果需要计算职位数,则需要访问职位表。
“另外,从可视化的角度来看,”
这里只是一个旁注,如果“可视化”是您的实际问题,那么数据库人员通常不会帮助您。
“同一个人会出现在两个地方。从功能的角度来看,这可能是正确的”
如果它是业务规则,那么它就是业务规则。通常不由你来质疑他们。如果不同的人共享同一个职位怎么办?例如。两个兼职人员,每个人都在做同样的工作。
“但是你会多次列出同一个人,这似乎很奇怪(也许这不是那么奇怪,但希望获得关于人们在这种情况下所看到的预期可视化的反馈,以及似乎可以接受的可能应该推动建模) 。”
嗯,你刚刚说了。如果这是商业规则,那并不奇怪。也许你以前从未遇到过这样的情况,但谁在乎呢?
“对“正确”的方法有什么建议吗?”
不是真的。您需要做的就是弄清楚要精确呈现哪些信息。所有现有职位,如果当前未占用,则名称为空?只有实际占据的职位,以及占据该职位的可能多人中的任何一个名字?等等等等。
【讨论】:
我绝对需要显示空缺职位(我会这样做,这就是为什么我显示职位而不是人)。我只是从来没有遇到过一个人有 2 份不同工作的情况,所以我想弄清楚我是否需要重构我的数据库设计...... .Just a sidenote here that if "visualisation" is your actual problem, database people are typically not the ones to help you.
- 笑得很开心!
我说的是内容可视化的技术,而不是结构的可视化技术!!!!!!!!!!!!!!!
Leora,给定的数据库设计(即没有任何指定的约束)支持一个人从事不同的工作,以及“一个工作有不同的人”。不需要重构仅仅因为必须支持其中任何一种可能性,因为它们已经支持。【参考方案3】:
我认为您应该考虑“职位”和“角色”之间的区别。在许多组织中,可能存在多个角色:安全协调员、采购、应付账款、接待员……通常,尤其是在较小的组织中,一个人可能在不同的时间担任不同的角色。甚至当他们以不同的身份行事时,他们甚至可能向不同的人报告(例如,应急响应人员可能向安全协调员报告,但采购员向运营负责人报告。)
为了正确反映这些事情,数据库中的关系需要尽可能地反映现实生活中存在的关系。这可能意味着您将拥有多个表(就像您已经拥有的那样),但它会保持整洁。
要记住的另一件事(并且可能值得在您的数据库中反映)是许多组织矩阵化:人们可能在某些项目团队中,并且部分某些组织。电气工程师可能都向电气工程经理汇报,但他们可能从事不同的项目/产品,因此属于不同的项目团队。
准确捕捉所有内容是很困难的。这是我的建议(与您的建议不同,但有一些调整):
表 1:员工 人名、员工 ID、开始日期、薪水、假期... 这张表显示了您何时获得报酬、您有多少假期、您的“人力资源状况”是什么。你们只有一个人——这张桌子只有你们一个人,用于那些不能加倍的东西(尽管我们都想要两张支票)。
表 2:经理 经理 ID、报告 ID、报告种类 该表针对每位经理说明了向他们报告的人员是谁,以及它们之间的关系类型。您可能有“主要”关系和其他关系:“项目负责人”、“团队负责人”……“主要”经理可能会根据“其他”经理的意见做出 HR 类型的决策。
表 3:团队 团队名称、团队 ID、经理 ID、BelongsToTeam、团队描述... 一个描述每个“组织实体”的表格,以及任何可能有用的辅助信息。 BelongsToTeam 允许团队的层次结构,这有助于可视化。
表 4:角色 角色名称、团队 ID、员工 ID、isPrimary 此表描述了谁在给定角色中。具有多个角色的员工将多次出现在此表中,并且可能会根据他们的角色向不同的经理报告。我在这里添加了一个“isPrimary”字段 - 不确定这是否是多余的。从某种意义上说,如果您从表 4 中员工的“主要”角色开始,并找出表 3 中的团队经理是谁,那么您应该以表 2 中的人为主要经理结束......我担心如果你把它放在两个地方,你最终可能会出现不一致。
我相信以上内容可以让您描述几乎任何组织 - 通过允许表 4 中的“isPrimary”字段,甚至有可能作为您的“人力资源老板”的同一个人出现在您的“项目”中第二个团队的领导者,甚至可能在应急响应团队中向您报告......
至于可视化 - 使用上述结构有两种明显的方法可以做到这一点。第一个是“严格等级” - 只显示他们的主要经理下面的人。这是“人力资源组织结构图”,每个人只出现一次。
您可以拥有第二张“基于团队”的图表。现在,每个团队都有自己的组织,同一个人可以出现在多个团队中。这些团队如何相互关联可能很棘手 - 但原则上,表 3 应该提供您需要的 BelongsToTeam 字段。
我期待听到您对此的看法!
【讨论】:
您的“职位和角色之间有区别”的说法很重要。正如你所说,但我会重复一遍,因为它是如此重要,管理/报告层次结构与团队完全无关(无论管理风格是否正式矩阵化)。许多跨职能团队由来自整个组织的人员组成。事实上,一个更初级的员工可能会领导一个团队,而一个更高级的员工“仅仅是”一个团队成员。这会带来轻微的改进:您还需要将组织作为单独的表来对部门和业务线进行建模。 @Floris - 我很好奇您对使用 PositionTeam 表(正如 Branko 建议的那样)来实现这个想法,即单个职位可以在多个团队中成为不同的“角色” 我认为显示员工与团队的直接联系(或员工的团队组成)比显示职位更好;多人可能有相同的职位(头衔)。例外情况是某人是团队的一员当然 - 但这些情况并不真正需要他们自己的桌子。 @Floris - 让员工加入团队的问题是,如果一个人离开,没有很好的方式表明那里有一个开放的“职位”..我使用的职位可能是与您想象的方式略有不同。我只是用它来代表团队中的一个控制点。一个职位和一个人通过分配表联系起来。所以我可以查看一个位置并查看随着时间的推移映射到该位置的不同人。此外,我们有联合负责人的案例,因此具有 IsHead 字段的 PositionTeam 似乎允许在多个团队中更灵活地定位并支持联合负责人 @leora - 我们所有提供意见的人都是基于我们自己的经验和对您要求的理解。最后,您接受我们的输入(您无法知道我们的资质),做出您自己的设计决定,并接受它们。如果我写的任何东西有帮助,我很高兴。您的调整对您描述的需求有意义。【参考方案4】:正如您所说,员工通常(正式或非正式地)在组织内履行多个角色。但是,就人力资源/工资单/其他管理部门而言,一名员工只会正式担任一个职位。重要的是要保持这一点,以确保人们不会获得两次报酬或以其他方式获得过高/过少的补偿等。
您可以通过将hr/admin_position
列添加到person
表来强制执行此操作。然后可以使用person_position
表记录他们实际担任的所有角色。
这还允许为人们分配一个不同于 HR 认为他们执行的职位的“组织结构图”职位。当团队负责人离开时,通常会发生这种情况;团队的一名初级成员将被“提升”为临时团队负责人,承担额外的责任。但是,工资或其他福利并没有相应的增加,因为 HR 仍然认为他们在担任更初级的职位。您可以添加额外的列以包含注释或标记以指示这些是临时位置。
【讨论】:
我不需要让 person_id 可以为空,如果有一个职位没有人,那么我根本不需要 PersonPosition 表中的记录。 .当一个人加入时,将在 personPosition 中创建一个记录。 . @leora - 好点,你不需要它。我已经删除了那部分以上是关于当人们拥有多项工作时,使用人员、职位和团队对组织进行建模的最佳方法是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
2022-05-29:为了不断提高用户使用的体验,开发团队正在对产品进行全方位的开发和优化。 已知开发团队共有若干名成员,skills[i] 表示第 i 名开发人员掌握技能列表。 如果两名成员各自拥有