0

私は現在ホテルのウェブサイトを開発しています。そして、私が実装しようとしていることの1つは、ワーカー->優れた関係です。MySQLでこれを行うための最良の方法は何ですか?

つまり、シェフの上司は料理長、料理長の上司はシフトマネージャー、シフトマネージャーの上司は総支配人です。従業員テーブルでは、上位従業員のIDを使用してフィールドを上位にすることはできますが、その場合、上位/上位の役割を1つしか取得できません。さらに重要なことに、マネージャーが特定のホテルで管理しているすべての従業員のリストを取得することはできません。

これについてアドバイスが必要です。

4

6 に答える 6

1

まあ、単純な隣接グラフ(supervisor_idがemployeesテーブルを指している)を使用すると、確かにやりたいことができますが、あまり効率的ではなく、多数の人に拡張することはできません。

おそらくあなたが望むのは、入れ子集合モデルを実装することです。これにより、組織内の任意の人物に報告するすべての人を非常に簡単に取得できます。

開発の初期段階にある場合は、モデルにネストされたセットの動作を提供するDoctrine ORMシステムを検討することを検討してください。そのため、独自の動作を実装する必要はありません。

編集:Richard Knopは、Celkoの100%-sqlの例よりも役立つと思われるphpサンプルコードを含む入れ子集合についての投稿をしています。

于 2009-09-20T19:12:49.347 に答える
0

タブでこれを行うことにより、マネージャーが管理するすべての従業員のリストを取得できます。

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

しかし、あなたや試合で複数の優れたものを作成する場合は、このような列を持つ新しいテーブルを作成してください

superior, person

または、ツリーのように表示したい場合は、クエリのループで実行してください

于 2009-09-20T19:10:29.083 に答える
0

おそらく、役割/機能を含む追加のテーブルまたはリストを作成し、各機能にレベルを割り当てる方がよいでしょう。したがって、レベル4はレベル3などの直接のボスになります。

于 2009-09-20T19:15:16.703 に答える
0

入れ子集合モデルをお勧めします。しかし、それは1人だけが彼らの真上に1人のマネージャーを持つことを許可すると言いました...

私は数年前にこれについてブログを書きました。MSSQLではOKですが、MySQLに変換する必要があります。

ここにリンク

これは、完全なリストなどを挿入/移動/取得する方法を示しています。

于 2009-09-20T19:18:29.010 に答える
0

シフトを扱っている場合、シフトマネージャーはシフトに取り組んでいるスタッフとは別に異なります。つまり、今週は、シェフが1人のシフトマネージャーの下でランチタイムのシフトに取り組んでいる可能性があります。来週、彼は別のマネージャーの下で夜勤をしているかもしれません。このような複雑さを念頭に置いてください。

于 2009-09-20T20:16:21.973 に答える
-2

これは、「ID」と「管理対象ID」の範囲(2つの値)の3つのフィールドで実行できます。これらのIDは実際には何にも基づいておらず、単に階層を説明するためのものです。

次に、すべての管理対象従業員を見つけるために、マネージャーの「管理対象ID」範囲内のすべてのIDを選択します。トップマネージャーのID範囲はすべての人をカバーし、彼の下のマネージャーはより狭い範囲をカバーします。

この設計の問題の1つは、人をシャッフルしたり、新しい人を追加したりするときに、階層をまっすぐに保つために全員の番号を付け直さなければならない場合があることです。これにIDの大きな間隔を使用する場合は、全体の番号を頻繁に変更する必要はありません。または、浮動小数点IDフィールドを使用できます。

編集:他の応答を読んだ後、これが入れ子集合モデルまたはその変形であることに気付きました。

于 2009-09-20T19:21:53.697 に答える