1

私の問題を説明するために、簡単な例を示します。

私のデータベースには3つのテーブルがあります。

【役職】
 --position_id INT
 -位置VARCHAR

[従業員]
 --employee_id INT
 --position_id INT --FK
 -名前VARCHAR
 --birth_date DATE

【車両】
 --Vehicle_id INT
 -モデルVARCHAR
 -年VARCHAR
 -カラーVARCHAR

問題は、会社でのポジションが「ドライバー」である1人の従業員に1台の車両を関連付ける必要があるということです。その場合のみです。

継承を使用して、1人の従業員(1-1の関係)に関連付けられたForeignKeyを持つ「Driver」という別のテーブルを作成しようとしましたが、プログラミング段階で選択されているかどうかを手動で確認する必要があるため、機能させることができませんでした位置ID(HTML select要素内)は「ドライバー」のIDです。それは良いプログラミング手法ではないと思います。

結論として、リレーショナルデータベースやプログラミングを損なうことなくこれを行う他の方法があるかどうかを知りたいと思います。

前もって感謝します!そして、悪い英語で申し訳ありませんが、それは私の第一言語ではありません。ご理解いただければ幸いです。

4

4 に答える 4

5

これは、「ポジション=ドライブの従業員のみが車両に関連付けることができる」というビジネスルールです。ビジネスルールは一般的にプログラミングで実装され、悪い習慣ではありません。プログラミングはビジネスロジックを書くために作られています。一般に、アプリケーションの開発中にデータベースレベルで実装できないようなインスタンスが大量に発生します。

ただし、これをDBレベルで制御したい場合は、トリガーを使用して、挿入/更新レベルでこの検証を確認できます。

于 2010-06-25T04:31:04.633 に答える
2

残念ながら、リレーショナルデータベースは、優れた階層オブジェクトストアを作成しません。ある種のオブジェクト関係モデルを使用してそれを偽造することを検討するかもしれませんが、その通りです。それは良い習慣ではありません。おそらく、従来のRDBMSではなく、専用のオブジェクトデータストアを検討してください。

于 2010-06-25T04:29:55.620 に答える
1

さまざまなトレードオフでそれを行うにはいくつかの方法があります。Scott Amblerには、代替案を図で示したすばらしいページがあります。

于 2010-06-25T04:41:05.430 に答える
0

これを行うための最良の方法は、EmployeeVehicles従業員を車両に接続するテーブルを用意することです。はい、これは、アプリケーション(またはトリガーまたはストアドプロシージャ)が特定のタイプのみEmployeeが実際にレコードを持っていることを確認する必要があることを意味しますEmployeeVehiclesが、通常、これらはビジネスロジックを格納するのに最適な場所です。データベースは、ビジネス固有のルールを追跡するためではなく、可能な限り最も正規化された方法でデータを格納するためにあります。知る必要がある限り、一部の従業員(0 .. *)は車両(1 .. *、またはおそらく1..1)を持っている可能性があります。

于 2010-06-25T04:32:54.207 に答える