2017-08-01 13 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 

また、作成されたマッピングテーブルmeals_to_restaurants_divisions 3列含まれています - だから、meal_id, restaurant_id, division_id

を私がレストラン1とそのすべての部門に食事を割り当てたい場合は、私が作成します記録:私は分裂2-2に食事を割り当てたい場合は、私はレコードを作成します

meal_id | restaurant_id | division_id 
     1 |    1 | null 

meal_id | restaurant_id | division_id 
     1 |   null | 4 

このようなスキームが正しいかどうかお答えください。どのように改善することができますか? meal_iddivision_idのマッピングテーブルを作成して、レストランに割り当てるのではなく、すべての部門に食事を割り当てる必要があると誰かが知っていることは知っています。しかし、レストラン1が今後新しい部門を作成する場合は、同じ権限を継承する(したがって、既存の食事が部門の代わりにレストランに割り当てられている場合、将来のすべての部門はレストランの権限を継承する)。さもなければ、私は手動ですべての食事を編集し、それに新しい部門を割り当てる必要があります。

私は第二の例ではrestaurant_idnullを使用する理由、誰かが興味を持っている場合は部門の親は(分割は別のレストランに割り当てられている)、後に変更された場合、私はマッピングテーブルをスキャンし、そこrestaurant_id値を変更する必要はありませんので、それはです。

答えて

0

モデルがであるかどうかを評価するには、が最も重要ですが、それはすべての要件を満たしていることです。あなたの説明は完全ではないので、あなたのためにそれを確認することはできません。たとえば、デビジョンが複数のレストランに同時に属しているかどうかを確認します。また、デビジョンを他のレストランに移動するときに、デビジョンの他の属性(デビジョンに割り当てられたスタッフ、注文履歴、未使用のロイヤルティまたはレーティングなど)が変更されたり変更されたりすることはありません。そのプロセスは、別のレストラン内で新しいデビジョンを作成し、すべての食事を新しいデビジョン(またはいくつかのディビジョン)に割り当てることと考えることもできます。それは正式なものよりも概念的な質問であり、もしそれがであれば、(さらに良いものがある場合)は要件に依存するでしょう。

正式、あなたのモデルがいる限り、このようなエントリはどんな意味がありませんので、あなたが、あなたの「許可」テーブルにrestaurant_iddivision_idの両方を設定したことがないよう、正しいです。 (restaurant_iddevisionテーブルのキーに含まれていない限り、あなたの説明には当てはまりません)。

テーブルは、基本的に暗黙の条件付きの平坦な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に、第1レベルの子をdevision_id-コラムのmeals_to_restaurants_divisions表に移動して、ツリーを「平坦化」しました。

ツリーは、レストランが別のレストランに属していない、またはサブサブディビジョンを持つことができないことを強制しません。基本的には、特別な種類のデビジョンではなく明示的にレストランを扱います(またはその逆)。

両方のモデルは、正式ではあるものの、自動的に強制する暗黙の条件(モデルの最大の深さなど)、手動で実施する必要がある(モデルに両方の列を設定しないなど)ツリーの最大の深さ)またはサポートされていない(モデルの細分など)それを要件と比較する必要があります。

サイトメモ:ツリーは実際には、データベース内の階層データの悪いモデルです。(再帰的に)いくつかのレベルを深く照会するのが複雑になり、より良いモデルが存在します。私は単純化のためにそれを使用しました.1レベルの子供しかいないので、この制限はあなたのケースには当てはまりません。

関連する問題