2017-08-01 15 views
0

使CMS管理餐館。簡而言之,有餐廳有自己的部門。此外,還有需要分配給餐廳的餐點(所有分部可以看到這些餐點)或個別分部(所以只有選定的分部才能看到餐點)。PHP/MySQL - 使用3(通常不是2)映射表來繼承權限

所以我創建的表:

restaurant_id | restaurant_name 
      1 | Restaurant 1 
      2 | Restaurant 2 


    division_id | restaurant_id | division_name 
      1 | 1    | 1-1 
      2 | 1    | 1-2 
      3 | 2    | 2-1 
      4 | 2    | 2-2 


     meal_id | meal_name 
      1 | Steak 

包含3列也造就映射表meals_to_restaurants_divisions - meal_id, restaurant_id, division_id

所以,如果我要指派餐餐廳1和它的所有部門,我會創造記錄:

meal_id | restaurant_id | division_id 
     1 |    1 | null 

如果我要指派餐只分裂2-2,我會創造一個紀錄:

meal_id | restaurant_id | division_id 
     1 |   null | 4 

有人會建議這樣的方案是否正確?如何改進?我知道有人會說,我應該只創建映射表,有2條記錄 - meal_iddivision_id,並將餐分配給所有分部,而不是分配給餐館,但這裏有一個問題:如果餐廳1未來創建新分區,我希望新分區繼承相同的權限(所以如果現有的餐點分配給餐廳而不是分部,所有未來的分部將繼承餐廳的權限)。否則,我需要手動編輯每餐,並指定一個新的分區。

如果有人有興趣,爲什麼我在restaurant_id在第二個例子中使用null,這是因爲如果劃分的父母在後面改變(師被分配到另一家餐廳),我並不需要掃描的映射表,並更改restaurant_id價值存在。

回答

0

若要評估您的型號是否爲正確,最重要的方面是它滿足所有要求。由於您的描述不完整,我們無法爲您驗證。你可以例如檢查devisions是否可以同時屬於幾家餐館。或者,如果您有其他屬性(例如,分配給員工的分配人員,訂單歷史記錄,優秀版稅或您網站上的評分),那麼當您將設計移至其他餐廳時,此更改或不會更改。你也可以把這個過程想象成在另一個餐廳裏創造一個新的分支,並把所有的餐點分配給新的分支(或者可能有幾個分支)。這是一個比正式問題更概念化的問題,如果是正確的(以及如果有更好的問題)將取決於要求。

正式,你的模型是正確的,只要你不設置在「權限」表都restaurant_iddivision_id,因爲這樣的條目將沒有任何意義。 (並且只要restaurant_id不是您的devision表中的密鑰的一部分,根據您的描述,情況並非如此)。

你的表基本上是一個平坦的2級樹,有一些隱含的條件。更一般的樹可能看起來像

id | parent 
---+------- 
1 | null   -- restaurant "1" (has no parent) 
2 | 1    -- devision "1-1" 
3 | 1    -- devision "1-2" 
4 | null   -- restaurant "2" 
5 | 4    -- devision "2-1" 
6 | 4    -- devision "2-2" 

在這棵樹,餐廳會像一個正常的等分進行處理(或等分會是什麼樣子餐廳),你可以分配的飯菜只是id。如果您想將餐1分配給餐廳1及其所有分部,則會創建記錄meal=1, id=1。如果您想僅將餐1分配到「2-2」分區,您將創建一個記錄meal=1, id=6

它隱含地阻止了你將某種情況下分配restaurant_iddivision_id到一頓飯(這是你模型中提到的條件),因爲這種組合不再存在。通過將父母移動到restaurant_id和(第一級)孩子到devision_id-表中的列,您「變平」樹。

樹不會執行餐廳不能屬於另一家餐館或您不能有子subde devisions。基本上,你把餐廳明確地視爲一種特殊的分割(反之亦然)。所以這兩個模型雖然在形式上是正確的,但它們有很多隱含的條件,它們會自動執行(如模型中的最大深度),您必須手動執行(例如不在模型中設置兩列,或者樹中的最大深度)或不支持(如模型中的細分)。您必須將其與您的要求進行比較。

網站說明:樹實際上是數據庫中分層數據的不好模型,因爲它複雜(遞歸地)查詢多個層次,並且有更好的模型。我只是爲了簡單而使用它 - 因爲你只有一級孩子,這個限制不適用於你的情況。