1つのテーブルのPKをFKとして他のテーブルに追加することにより、1対多の関係を実装します。 2つのテーブルのPKを3番目のテーブルに追加することにより、多対多の関係を実装します。
IS-A関係をどのように実装しますか?
エンティティは技術者と管理者であり、どちらも従業員です。テーブルEMPLOYEE(id、name、surname、role、... AdminFields ...、... TechFields ...)で追加のフィールドを使用できます
しかし、私はIS-Aオプションを探求したいと思います。
編集:ドニーが示唆したように、ロールフィールドなしでやった。
Donnieが提案したように行いましたが、roleフィールドはありませんでした。これが最終的な実装です。
DDL:
CREATE TABLE Employee (
ast VARCHAR(20) not null,
firstname VARCHAR(200) not null,
surname VARCHAR(200) not null,
...
PRIMARY KEY(ast)
);
CREATE TABLE Administrative (
employee_ast VARCHAR(20) not null REFERENCES Employee(ast),
PRIMARY KEY(employee_ast)
);
CREATE TABLE Technical (
employee_ast VARCHAR(20) not null REFERENCES Employee(ast),
...
PRIMARY KEY(employee_ast)
);
ER図:
このモデルには、ジェネリックタイプの従業員はいません。ここでは、従業員は管理者または技術者のみです。
私は常にこれをrole
フィールド、そしてオプションの関係で行ってきました。
つまり、テーブルEMPLOYEE (id, ...generic fields... , role)
そして、各役割に対して:
テーブルROLE1 (employeeid, ...specific fields...)
これにより、単一のクエリで一般的な従業員情報を取得でき、ロール固有の情報を取得するには結合が必要です。これの1つの(大きな)欠点は、すべてのロール情報を含む1つのスーパーレポートが必要な場合に、多数の外部結合で行き詰まることです。
IS-A関係は、gen-spec設計パターンとも呼ばれます。 Gen-specは、「一般化の専門化」の略です。
リレーショナルモデルには継承が組み込まれていないため、gen-specのリレーショナルモデリングはgen-specのオブジェクトモデリングとは異なります。
Gen-specをテーブルのコレクションとして実装する方法を示す優れた記事を次に示します。
http://www.javaguicodexample.com/erdrelationalmodelnotes1.html
特別なテーブルで主キーが設定される方法に特に注意してください。これが、これらのテーブルの使用を非常に簡単にするものです。
他の多くの記事は、googlinの「一般化専門化リレーショナルモデリング」で見つけることができます。
リレーショナルバックエンドデータベースに接続する必要があるOOアプリケーションがある場合、Martin Fowlerの Patterns of Enterprise Application Architecture を取得することをお勧めします。
彼はまた、彼のウェブサイトにいくつかの関連するメモと図を持っています。具体的には、パターン 単一テーブル継承 、 クラステーブル継承 、および 具体的なテーブル継承 は、データテーブルでIS-Aをマッピングするための3つの戦術を説明しています。
HibernateまたはJPAを使用している場合、これらはすべて異なるマッピング名を持っていますが、これらすべてのマッピングをサポートしています。
この特定の例では、IS-Aはまったく使用しません。
従業員の役割などは、HAS-Aとしてより適切にモデル化されます。
このペーパーでは、一般化をスキーマ設計にマッピングするためのいくつかの戦略について説明します。
http://www.sztaki.hu/conferences/ADBIS/3-Eder.pdf
要約のコピー:
オブジェクトリレーショナルデータベースのより豊富なデータモデルは、データベーススキーマの論理設計に多くのオプションを提供し、論理データベース設計の複雑さを大幅に増大させます。概念モデルの一般化構成に焦点を当て、一般化をオブジェクトリレーショナルデータベースシステムのスキーマにマッピングするためのさまざまな設計代替案のパフォーマンスへの影響を調査します。
これを1対0/1テーブルの関係として実装してみませんか?たとえば、VehicleIDの主キーを持つVehicleという基本クラスを表すテーブルがあるとします。次に、Vehicleのすべてのサブクラスを表す任意の数のサテライトテーブルを作成できます。これらのテーブルには、VehicleIDが主キーとしてあり、Vehicle-> Subclassから1-> 0/1の関係があります。
または、よりシンプルにしたい場合、いくつかのサブクラスしかなく、その変更の可能性がほとんどないことが確実であることがわかっている場合は、識別型フィールドを持つ単一のテーブルで構造全体を表すことができます。
単階層を構築するか、多階層を構築するかによって異なります。これはハードコーディングされたデザインであり、あなたが望んでいたものだと思います。
モノ(子テーブルには親テーブルが1つあります)の場合、子IS-A親、FKとPKは子テーブルで同じであり、そのキーは親テーブルのPKでもあります。
ポリ(子テーブルに複数の親テーブルがある)の場合、子IS-A parent-1および子IS-A parent-2には、複合キー(テーブルレコードを一意にするための複数の主キーを意味する)があります。各キーの単一階層と同じです。
ほとんどのORMは、単一の列弁別子を使用してIS-A関係を実装し、特定の列の値に基づいてインスタンス化するサブクラスを選択します。あなたの例に関しては、おそらく実際にはroleを意味しないでしょう。通常、人は多くの異なるタイプの役割を果たすことができるからです。通常、ロールはhas-a関係としてモデル化されます。 is-aリレーションシップ(またはサブクラス化)を使用して実装しようとすると、必然的に、より複雑なケースを処理するために何か複雑なことをしなければならなくなりますハイブリッドの職に就く人、つまり、ローカルITの人としても機能し、両方の権限または属性を必要とする秘書。