2011-07-17 46 views
0

在我的計劃,我需要一個組織結構圖開始與個人和一個管理器下對它們進行分組,然後根據組高級經理等這些高級管理人員......我怎麼這樣做關於數據庫?這是一種多對一的關係 - 我認爲這是非法的,也是不可能的,並且會像在創建其父母經理之前從子表開始 - 個人 - 一樣。 如果有人能幫助我指出正確的方向來設計我的數據庫,我真的很感激它!解決許多一對一,之前父表問題兒童

---- 編輯 ---- 這裏是我的問題的更詳細的解釋:

比方說,我的程序的用戶開始通過輸入三五個人,他們想使用在一些項目上,他們將繼續努力。現在,可以創建幾個可能的管理職位,並將僱員/其他(低級)經理分配到這些職位。用戶不需要創建任何特定位置,但可以選擇並分配他們喜歡的位置。唯一的限制是總會有一位高級經理 - 讓我們稱他爲總裁吧 - 並且他應該(但不必)只將5-10人分配給任何給定的經理(包括總裁)。所以在這個例子中,我們從35個人和一位總統開始。現在我們開始將35個人分組爲團隊,並將其中一人作爲經理。假設用戶決定有兩支6支隊伍,兩支9支隊伍和一支5支隊伍 - 每支隊伍都有一名成員擔任該隊伍的經理。所以現在我們有5個小組,每個小組都有自己的經理,現在這五位經理將被分配給總裁。該方案會讓這個去,但警告用戶,在最後一支球隊經理下的人數少於5人(僅4人)。因此,用戶現在可以(或在任何時間)返回並更改組織。所以我們假設他想解決這個問題並改變團隊。因此,他打破了9人的兩支球隊中的一支,並將一名個人分配給一個短小的球隊。這使得最後一支球隊有6支隊伍(5名個人隊員和1名經理),一支9支隊伍(8支隊員和1名隊友)以及一支8支隊伍(7支隊員和1名隊友)以及全部5名隊長總統。只有

在現實生活中這可以得到細分更遠 - 與管理的要高很多級的巢穴。我怎樣才能做到這一點?

是以下仍然有效喬Hopfgartner的答案嗎?即使角色將在稍後分配(在最初創建行之後),我是否可以創建「角色」列?或隨時更改?這個自引用外鍵可以爲null嗎? (就像在沒有經理分配的情況下那樣)或者我應該在他們被分配到一個團隊之後將這些個人移動到一個單獨的「團隊」表中,並且一旦他們被分配到一個團隊中並將他們移動到「經理」已被分配爲管理員,然後爲引用管理器表的團隊表添加外鍵?我也使用MySQL,所以你不能使用自引用ON UPDATE CASCADE或ON UPDATE SET NULL操作會影響我的特殊情況(因爲用戶無疑會經常改變任務)?

非常感謝你對我的幫助與此!

+0

爲什麼多對一關係是「非法和不可能的」? –

+0

你如何在多對一的關係中使用外鍵? – pleasehelpneeddesignhelp

+0

您只需使用非唯一索引。假設table'employees'具有'id'和'manager_id'列,其中'id'是主鍵,'manager_id'可以是NULL並且用INDEX定義。然後你可以這樣做:'ALTER TABLE manager ADD FOREIGN KEY(manager_id)REFERENCES employees(id)ON DELETE SET NULL ON UPDATE CASCADE'。該表應該被定義爲使用InnoDB引擎來限制工作。請注意,[MySQL手冊](http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html)明確指出:_外鍵可以是自引用的(指的是同樣的表)._ –

回答

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) 
+0

「如果要確保只有管理人員可以分配給他們,那麼在使用外鍵約束時,這可能會非常棘手」嗯,一個人可以成爲經理,也可以分配給經理......這有什麼關係嗎?我認爲,無論如何,我寧願不在同一張表中使用「角色」字段。但是所有的人都會在同一張桌子上。那麼,我必須走那條路嗎?或者,一旦他被指定爲經理並將他的下屬與他聯繫起來,我可以將這個人移到經理桌上嗎?然後把他和他的經理聯繫起來? – pleasehelpneeddesignhelp

+0

最後的結構也應該滿足您的所有需求。所有人員都在人員表中定義,管理員表中的相應條目爲他們提供了管理員屬性。現在包括經理在內的任何人都可以分配給任何數量的經理,但只有他們是經理。 –

+0

在分配經理之前,所有人都將被分配到一個「團隊」,所以也許我應該有一個「團隊」表1,person_id(主人,與person_id中的person_id關聯),然後是管理員表,然後一個人擁有經理表?謝謝!!!! – pleasehelpneeddesignhelp

1

這是一棵樹。您可以使用帶有parent_id字段的單個表來指示哪個記錄是當前父記錄的父記錄。

+0

據我所知,如果我有第一個父表,我可以指出哪個記錄​​是父記錄,但這正是我的問題。我首先有子表(表),然後必須在創建父表後,然後將它們鏈接起來。我怎麼能這樣做......這是不可能的。那麼我能解決它嗎? – pleasehelpneeddesignhelp