0

データベース試験のプロジェクトを行っていますが、難しい点で行き詰まっています。これは私の ER 図の抜粋です。

http://i.stack.imgur.com/d1WQd.png

ご覧のとおり、エンティティ Employee は、Waiter と Cook を一般化したものです。ヘッドウェイターとチーフクックは、それぞれウェイターとクックのスペシャライゼーションです。チーフのみがサプライヤーへの注文 (この抜粋には含まれていません) を履行できます。明らかに、一度に 1 人のチーフだけが注文を履行できます (図が煩雑にならないように、単一の履行関係を作成しました)。

ER図を改造した後(正しい言葉を使用していない場合は申し訳ありませんが、英語で翻訳しています)、これが結果です:

http://i.stack.imgur.com/GFOyD.png

したがって、従業員には役割 (ウェイター、コックなど) が必要であり、役割ごとに (明らかに) チーフは 1 人しか存在できません。これが正しいかどうかは本当にわかりません。二重の一般化は私を大いに混乱させます。

次のステップは論理図 (テーブル) です。これは完全に混乱しています。これは可能な解決策です:

ここに画像の説明を入力

これはリレーショナル モデル (tblChief の FK2 に Unique Not Null 制約がある) への可能な変換ですが、弱点があります。tblEmployee の Employees ロールを変更すると、tblChief はこのエラーを認識せず、整合性が失われます。tblEmployee(Role) と tblChief(Role) の間に FK を追加することは良い解決策でしょうか? それとも、醜い/面倒ですか?

考えられる 2 番目の解決策を考えました。私はそれを好みますが、それでも大丈夫かどうかはわかりません:

ここに画像の説明を入力

ここでは、エンティティ Role とエンティティ Chief を 1 つのテーブルにマージしました。フィールド Chief は IDEmployee を参照しますが、ここでも Unique かつ Not Null である必要があります。

これらの解決策は正しいですか? 従業員と役割を挿入および更新するときに、これは大きな混乱になると確信しています(整合性チェックを一時的に削除しない限り、これを行うことはできません)。これを別の方法で行うことはできますか?

長い投稿で申し訳ありません (画像のリンクについては、直接投稿することはできません)。

4

1 に答える 1

0

最後の図は意味がありません。

各従業員には 1 つの役割があります (これは FK 関係です)

各ロールには、 1 つの上位ロールを設定できます。これは、ロール テーブルに戻る null 許容の FK 関係です。(自体)。あなたが持っているように従業員にしないでください。

マネージャーであるすべての従業員を検索するには、次のような select ステートメントを使用します。

SELECT * 
FROM employees
WHERE roleID in (SELECT roleID 
                 FROM role 
                 WHERE superiorID IS NULL)

また

SELECT * 
FROM employees E
LEFT JOIN role R ON E.roleID = R.roleID
WHERE R.superiorID IS NULL
于 2012-07-16T00:21:44.940 に答える