在父表问题之前解决多对一,子问题

时间:2011-07-17 01:36:51

标签: mysql database-design many-to-one

在我的计划中,我需要创建一个组织结构图,从个人开始,然后将他们分组到一个经理,然后将这些经理归入高级经理等......我如何对数据库做这个?这是一对多的关系 - 我认为这是非法和不可能的 - 并且就像在创建其父级经理之前从子表 - 个人开始一样。 如果有人可以帮我指出正确的方向设计我的数据库,我真的很感激!!

----的 修改 ---- 以下是对我的问题的更详细解释:

假设我的程序的用户首先输入了他们想要在他们将要处理的某个项目上使用的35个人。现在,可以创建几个可能的管理职位,并将员工/其他(较低)经理分配给这些职位。用户不必创建任何特定位置,但可以选择并分配他们喜欢的位置。唯一的限制是总会有一位高层管理人员 - 让我们称他为总统 - 并且他应该(但没有)只给任何一位经理(包括总统)分配5-10人。所以在这个例子中,我们从35个人和一个总统开始。现在我们开始将35个人分组到团队中,并将其中一人分配为经理。假设用户决定拥有两个团队,其中包括6个团队,两个团队,每个团队9个,以及一个团队5个团队 - 每个团队都有一个独立成员被指派为该团队的经理。所以现在我们有5个团队,每个团队都在自己的经理之下,现在这五个经理将被分配到总统。该程序将允许这样做,但警告用户,最后一个团队的经理人员数量少于5(仅为4)。因此,用户现在可以(或在任何时间)返回并更改组织。所以,让我们说他想解决这个问题并改变团队。所以他打破了9支队伍中的一支,并将一个人分配给一个人很短的球队。最终计算出3支6人团队(5名个人和1名经理),1支9人团队(8人和1人),1支8人团队(7人和1人),所有5名团队经理都被分配到致总统。

只有在现实生活中,这才能进一步细分 - 拥有更多层次的管理。我怎么能这样做?

Joe Hopfgartner的回答是否仍然有效?我可以只创建一个“角色”列,即使稍后会分配角色(在最初创建行之后)?或者随时更改?这个自引用外键是否可以为空? (因为在没有分配任何经理的情况下也是如此)或者我应该在将他们分配给团队后将他们移动到单独的“团队”表中,并将经理移动到“经理”表中是否已被指定为经理,然后为引用经理表的团队表添加外键?

另外,我正在使用MySQL,那么你不能使用自引用ON UPDATE CASCADE或ON UPDATE SET NULL操作会影响我的特定情况(因为用户无疑会经常更改分配)吗?

非常感谢你帮我解决这个问题!

2 个答案:

答案 0 :(得分:1)

这是一棵树。您可以使用带有parent_id字段的单个表来指示哪个记录是当前记录的父记录。

答案 1 :(得分:1)

如果一个人只能有一个经理,只需引入一个“父人”id字段或将经理放在一个单独的表中。

如果没有,为“person_has_manager”之类的关系创建另一个表,将一个人分配给经理。

您也可以将经理和人员放在同一个表中并引入“角色”字段,但如果您想确保只有管理人员可以为其分配人员,那么在使用外键约束时这可能会非常棘手。

要解决此问题,您可以引入一个“person_is_manager”表,该表将人员​​作为经理链接到他们的工作,并且可以链接人员以由该经理进行管理。这应该是这样的:

persons
-> person_id (primary)
-> name
-> etc

managers
-> person_id (primary, linked to person_id in persons)

person_has_manager
-> person_id (primary)
-> manager_id (primary, linked to person_id in managers table)