我有一个有趣的建模问题。我正在尝试在网站上生成组织结构图(后端是C#/ SQL服务器,前端是javascript / google orgchart API,但建模问题的关键是更通用,所以我没有包含任何特定的技术下面的标签因为问题不在于任何技术特定问题。
我有以下4个数据库表:
当我有一个简单的香草组织结构图时,这非常有效,因为我基本上遍历每个团队(因为每个人都有 ParentTeamId )并构建团队层次结构并显示该团队中的位置(使用 TeamId 字段)并显示“Ishead”= true,并将与该职位相关联的人员显示为头部。
我的问题是(并非如此罕见),现在有些人被赋予了多重责任 - 他们基本上有2个不同的工作。以前,乔是市场营销主管,比尔是区域主管,但乔离开了
在营销负责人和区域主管之前,这是两个不同的人(2个不同的职位)所以Bill是营销主管,但也是区域经理美国。我试图找出建模和可视化的正确方法。
建模问题的第一部分是决定我是否应该将其建模为两个不同的位置。如果我这样做,我可以在此 PersonPosition 表格中有多个条目(两者都具有相同的 PersonId ),但问题是我觉得我的位置数量过多。
此外,从可视化的角度来看,同一个人会出现在两个地方。也许这从功能的角度来看是正确的,但似乎奇怪的是你会多次列出同一个人(也许它不是那么奇怪,但想得到反馈,人们在这种情况下看到的是预期的可视化和什么似乎可以接受也许应该推动建模)
有关“正确”方式的任何建议吗?
答案 0 :(得分:10)
看起来你需要类似的东西:
在所有可能的位置“类型”(Position
)中,我们构建了一组存在于特定团队中的职位(TeamPosition
),并确定填补每个职位的人({{1} }} 1 )。
头部由TeamPosition.PersonId
2 中的“反向”外键FK2表示。与布尔标志不同,这自然地确保每个团队不能有多个头部位置。
这种模式还允许不同的团队由不同类型的职位领导:例如,一个团队可能由“营销负责人”领导,而另一个团队由“高级技术官员”领导。
据我所知,仍然可以让同一个人完成多个位置(包括头部位置),这符合您的要求。如果这是真的,那么我真的没有看到在UI中显示同一个人作为多个团队的成员的问题。或者,你可以指定一个人的位置为“主要”(使用类似于上面的“反向”FK),然后只显示主要位置和旁边的“更多......”按钮(或类似)。
1 如果没有空缺的球队位置,请将其设为非空。如果每个团队可以多次存在相同的位置,请将Team
移至PersonId
PK,或向PK添加新字段TeamPosition
。如果同一个人不能在同一个团队中拥有多个职位,请在PositionNo
上添加备用密钥。
2 不幸的是,MS SQL Server比其他一些DBMS更加娇气,并拒绝对像这样的循环引用进行引用操作(例如ON DELETE CASCADE)。如果您需要参考操作,请通过INSTEAD OF触发器实现它们。
答案 1 :(得分:3)
我认为你应该考虑“位置”和“角色”之间的区别。在许多组织中,可能存在多种角色:安全协调员,采购,应付账款,接待员......通常,特别是在较小的组织中,单个人可能在不同的时间担任不同的角色。甚至可能是当他们以不同的身份行事时向不同的人报告(例如,紧急救援人员可以向安全协调员报告,但是购买者向运营主管报告。)
为了正确反映这些事物,数据库中的关系需要尽可能地反映现实生活中存在的关系。这可能意味着你将有多个表(就像你已经拥有的那样),但它会保持干净。
要记住的另一件事(并且可能值得在您的数据库中反映)是许多组织矩阵:人们可能在某些项目团队,而且某些组织电气工程师可能都向电气工程经理报告,但他们可能正在处理不同的项目/产品,因此属于不同的项目团队。
准确捕捉所有这些很难。这是我的建议(与你的不同,但有一些调整):
表1:员工人名,员工ID,开始日期,薪资,假期,...
这张表说明当你获得报酬时,你有多少休假时间,你的“人力资源状况”是什么。你们中只有一个人 - 这张桌子只有你们中的一个,用于那些不能加倍的东西(尽管我们都喜欢两张支票)。
表2:经理经理ID,报告ID,报告类型
该表列出了每位经理,他们是向他们报告的人,以及他们之间的关系。您可能有“主要”关系,以及其他关系:“项目负责人”,“团队负责人”,......“主要”经理可能会根据“其他”经理的意见制定人力资源类型决策。
表3:团队团队名称,团队ID,经理ID,BelongsToTeam,团队描述,...
描述每个“组织实体”的表,包含可能有用的任何辅助信息。 BelongsToTeam允许团队的层次结构,这有助于可视化。
表4:角色角色名称,团队ID,员工ID,isPrimary
此表描述了谁在某个角色中。具有多个角色的员工将在此表中多次显示,并可根据他们的角色向不同的经理报告。我在这里添加了一个“isPrimary”字段 - 不确定这是多余的。从某种意义上说,如果你从表4中的员工的“主要”角色开始,并找出表3中的团队经理是谁,那么你最终应该得到表2中的主要经理人...如果你把它留在两个地方,我担心你最终可能会出现不一致。
我相信上面的内容允许你描述几乎所有的组织 - 通过允许表4中的“isPrimary”字段,甚至可能是作为你的“人力资源老板”的同一个人出现在你的“项目”中领导者“在第二个团队中,甚至可能在紧急响应团队中向您报告......
至于可视化 - 使用上述结构有两种显而易见的方法。第一个是“严格分层” - 只显示他们的主要经理下面的人。这是“人力资源组织结构图”,每个人只出现一次。
您可以拥有第二张“基于团队”的图表。现在,每个团队都有自己的组织,同一个人可以出现在多个团队中。这些团队如何相互关联可能很棘手 - 但原则上,表3应该提供您对BelongsToTeam字段所需的内容。
我期待听到你的想法!
答案 2 :(得分:1)
正如您所说,员工通常(正式或非正式地)在组织内履行多个角色。但是,就人力资源/工资单/其他管理部门而言,员工只能正式担任一个职位。重要的是要预先确定这一点,以确保人们不会被支付两次或以其他方式获得补偿/补偿等。
您可以通过将hr/admin_position
列添加到person
表来强制执行此操作。然后可以使用person_position
表来记录他们实际执行的所有角色。
这也允许为人们分配一个“组织结构图”位置,该位置与HR认为他们执行的位置不同。当团队领导离开时,这通常会发生;团队的一名初级成员将“晋升”为临时团队领导,承担额外责任。但是,工资或其他福利没有相应增加,因为人力资源部门仍然认为他们做的是更低级的职位。您可以添加额外的列以包含注释或标记,以指示这些是临时位置。
答案 3 :(得分:1)
“建模问题的第一部分是决定我是否应该将其建模为两个不同的位置。如果我这样做,我可以在此PersonPosition表中有多个条目(两者都具有相同的PersonId),但问题在于感觉就像是在过多计算职位。“
没有问题。你提到的问题是,如果有人想“计算职位数”,但是访问人员位置表这样做,就会出错。不了解数据库,数据模型或其他什么,事情是:如果需要的是计算位置数,则需要访问位置表。
“另外,从可视化的角度来看,”
这里只是一个旁注,如果“可视化”是您的实际问题,那么数据库人员通常不会帮助您。
“同一个人会出现在两个地方。从功能的角度来看,这可能是正确的”
如果这是业务规则,那么它就是业务规则。通常不由您来质疑它们。如果不同的人共享同一个职位怎么办?例如。两个兼职人员各自做同样工作的一半。
“但似乎很奇怪,你会多次列出同一个人(也许它不是那么奇怪,但想得到反馈,人们在这种情况下看到的是预期的可视化,看起来可以接受的东西可能会推动建模) 。“
嗯,你刚刚说过了。如果这是商业规则那么它并不奇怪。也许你以前从未遇到过这种情况,但是谁在乎呢?
“对”正确“方式的任何建议吗?”
不是真的。您需要做的就是弄清楚精确要呈现的信息。所有现有的职位,如果他们目前没有被占用,那么他们的名字是空的?只有有效占据的位置,可能有多个人的任何单一名称占据该位置?等等。