2009-09-20 201 views
0

我目前正在爲酒店開發一個網站。而我即將實施的其中一件事就是工人與上司的關係。在MySQL中這樣做的最好方法是什麼?數據庫設計問題

以下是我的意思:一位廚師的上司是一名主廚,主廚的上級是班主任,班主任的上司是總經理。在員工表中,我可以使用高級員工的ID作爲領域優勢,但是我只能獲得一個高級/高級角色;更重要的是,我無法檢索經理在特定酒店管理的所有員工名單。

希望這已經足夠清楚我需要什麼建議..謝謝你的努力。

+0

你想要一個僱員有幾個老闆? – elviejo79 2009-09-20 19:12:13

+0

對不起,我忘記提到一個員工最多可以有1個上司,所以像總經理一樣從頂層到底層的層次結構更重要的是可以查看所有員工的數據。與能夠查看所有員工的數據但不能查看其他班次經理的數據的班次經理不同。 – ant 2009-09-20 19:17:04

回答

1

好,用一個簡單的鄰接圖(supervisor_id在emplo指回yees表),你當然可以做你想做的事情,但效率不高,並且不會擴展到大量的人。

你可能想要的是實現一個nested set model。這使您可以非常輕鬆地抓住每個向組織中的任意人員報告的人員。

如果您足夠早進行開發,您可以考慮查看Doctrine ORM系統,該系統爲模型提供了嵌套集行爲,因此您不需要實現自己的行爲。

編輯:理查德·克諾普有一篇關於nested sets with php example code,你可能會發現比Celko的100%-sql例子更有幫助..

+0

我喜歡你的答案,現在我要做一些閱讀..並希望事情將如何他們應該是:D tnx – ant 2009-09-20 19:30:52

+0

我有問題關於這篇文章http://www.intelligententerprise.com/001020/celko.jhtml;jsessionid=CQYCHUUILHLFRQE1GHRSKH4ATMY32JVN如何插入數據到數據庫中,通過插入它們手動創建PHP表單來執行它,就像計算這些一樣:這有一些可預測的結果,我們可以用於構建查詢。根始終是形式(left = 1,right = 2 *(SELECT COUNT(*)FROM TreeTable));葉節點總是(左+ 1 =右); BETWEEN謂詞定義子樹;等等。 – ant 2009-09-20 20:09:08

+0

不確定你在問什麼,但希望我剛添加到我的答案的鏈接將有助於爲你闡明事情。 – timdev 2009-09-20 20:20:50

0

你可以得到所有經理管理通過對你的標籤這樣的員工的列表:

SELECT * FROM employees WHERE `superior`='id goes here' 

但是,如果你或回合製出一個以上出衆只是做一個新的表像這樣的列

superior, person 

,或者如果你想顯示它就像一棵樹只是做它在查詢的循環

+0

對不起,我忘記提到一個員工最多可以有1位上司,所以像總經理一樣從頂層到底層的層次結構更重要的是可以查看所有員工的數據。與能夠查看所有員工的數據但不能查看其他班次經理的數據的班次經理不同。 – ant 2009-09-20 19:15:56

+0

好吧,這很容易,因爲那麼你只是喜歡上面的第一個查詢 – kennyisaheadbanger 2009-09-21 17:05:42

0

也許你會過得更好創建一個額外的表或列表與角色/功能和分配因此4級會成爲3級的直接老闆等。

0

我建議一個嵌套集合模型。但是,表示只允許1人直接在他們之上擁有1位經理...

我在幾年前寫了一篇博客。確定它在MSSQL中,但它應該轉換爲MySQL確定。

Link here

這表明如何插入/移動/檢索完整列表等

-2

你可以用三個字段,一個「ID」和「管理標識」範圍(兩個值)做到這一點。這些ID不是基於任何真實的,而只是描述層次結構。

然後,要查找所有管理員工,請選擇經理的「受管理的ID」範圍中的每個ID。高層管理人員的ID範圍涵蓋了所有人,其下的管理人員覆蓋的範圍較小,等等,這些人不管任何人,只有他們自己的範圍。

這個設計的一個問題是,當你洗牌或添加新的人時,你有時必須重新編號,以保持層級。如果你爲此使用了很好的ID大間隔,那麼你不必經常重新編號整個事物。或者你可以使用浮點ID字段。

編輯:在閱讀其他回覆後,我注意到這是嵌套集合模型或其變體。

0

如果您正在處理班次,班次經理將與班次工作人員分開。也就是說,本週,一名廚師可能正在一名班次管理員的午餐時間內工作;下週,他可能會在另一位經理的晚班上工作。一定要記住這樣的複雜性。