2016-05-17 3 views
3

私はデータベーステーブルの設計に助けが必要です。条件付きの関係を設計する

従業員
同上

をEmployeeTypeIdはEmployeeType
同上
名前

カー
同上
社員

従業員(ドライバ)の1つのタイプのみがCarテーブルの外部キーになることを強制するか、テーブルを再設計する必要がありますか?

+0

私はあなたのrdbmsに依存すると思う。 Sqlサーバーでは、外部キー制約のみでは実行できません.CardテーブルにCheck制約を追加して、EmployeeTypeをチェックする必要があります。他のデータベースには他の解決策があるかもしれません。 (私は、例えば、MySqlがチェック制約を強制しないことを知っているので、別の解決策を考え出す必要があります)。 –

+1

これは私にとってはビジネスルールのように思えますが、ビジネスロジックをデータベースやビジネスレイヤーやCRUDオペレーションの外に置こうとする傾向があります。 – Kritner

+0

そして、私はデータベースにビジネスルールを持つのが好きです。データベースが誤った挿入を防ぐと、一貫性のないデータにつながる間違いを犯すことはできません。誤ってガーデナーが会社のために運転する車を入力したい場合は、例外が発生します。しかし、与えられた星座でこれを強制するのはそれほど簡単ではありません。 –

答えて

2

信じられないデータが入力されないように、データベースを前腕させることをお勧めします。

は車のテーブルにEmployeeTypeIdを追加します。ここにこれを強制するには、しかし、

ソリューション1 ...少しトリッキーです。次に、(EmployeeId、EmployeeTypeId)をEmployeeテーブルの外部キー(外部キー参照のために使用できるように、2つのフィールドにuniqe制約を作成する必要がある場合があります)を作成します。次に、Car.EmployeeTypeIdに制約を追加して、それがドライバであることを確認します。これは冗長に見えますが、実際には問題ありません。従業員に別のEmployeeTypeを割り当てることができないため、一貫性が保証されています。私はこのアプローチが少し不器用だと認めます。

解決方法2:

が例外をスロー他に、従業員を検索し、それがドライバーであることを確認し、車のテーブルの上に前のインサートティガーを使用してください。これは私の意見では、その単純さのためだけに、より良い解決策です。次に、使用しているタイプの一意の名前を持つ列車を表の車に追加することができます。 UniqueName = 'DRIVER'なので、IDをマジックナンバーとして使う必要はありません。あなたは、通常、1つのEmployeeTypeがデータベースの他のものと同じように優れていることがわかります。特定のエントリに特殊ロジックを構築する場合は、そのためのハンドルが必要です。一意の名前はこれを行う1つの方法です。フラグIsDriver = TRUE/FALSEは別の名前になります。

+1

もし自動車ドライバーがいくつかの特定の関係に参加しなければならないなら、私はサブタイプエンティティを作成する方がいいでしょう。トリガーに関するオプションノートも、この人物を引っ張るために従業員のアップデートでトリガーを必要とします。これ以上ドライバーではありませんが、まだ車から参照されています。 – Serg

+0

FOREIGN KEYのUNIQUE制約を参照するのは悪い習慣ではありませんか? – user49126

+0

申し訳ありませんが、それが明確でない場合。 * parent *テーブルには、一意の列または列のグループがあります。cildテーブルの外部キーは、この列またはこの列のグループを参照します。 –

関連する問題