以下は、エンティティのハードコードされた一般化UML論理モデルの画像です。これらのクラスを物理データモデルのテーブルとして実装したいと思います。
2つの派生クラス/エンティティ(Class2とClass5)は、それぞれが単一の基本クラス/エンティティから派生しているため、単一の継承の一般化を示しています。 Class2 IS-AClass1。 Class5 IS-AClass4。
また、Class3には2つの基本テーブル(または2つの親エンティティ)があるため、多重継承の一般化が示されています。 Class3 IS-A(Class1およびClass4)。または、Class3 IS-A Class1 OR Class3 IS-AClass4。
これが私の質問です。それぞれから1つの例を選択します。一貫性を保ちたいです。これはどのように実装する必要がありますか?それとも私はシナリオを逃したのでしょうか?
1。)単一の継承:PK/FK値は派生テーブル(たとえばClass2)にどのように実装されますか?
(1a) attribute1を派生テーブルのPKとし、FK#1(親/ベーステーブルPKのみを指す)とします。
または...
(1b) attribute1を派生テーブルのPKにします。また、attribute2は派生テーブルへのFKです(ベース/親テーブルPKのみを指します)。
2。)多重継承:PK/FK値は派生テーブル(たとえばClass3)にどのように実装されますか?
(2a) attribute1を派生テーブルのPKとし、FK#1(最初の親/ベーステーブルPKを指す)にします。次に、attribute2をFK#2(2番目の親/ベーステーブルPKを指す)にします。
または...
(2b) attribute1を派生テーブルのPKにします。そして、attribute2をFK#1(最初の親/ベーステーブルPKを指す)にします。そして、attribute3をFK#2(2番目の親/ベーステーブルPKを指す)にします。
私はこれを(単一の継承のために)次のように解決しました:
クラスの各拡張機能は、その主キーとして基本クラスの主キーを継承し、常にそのfkで直接の基本クラスをターゲットにします。
class A
class B extends A
class C extends B
A(id,p1)
B(id,p1,p2)
B(id,p1,p2,p3)
Table A:
id: primary key
p1: sth
Table B:
id: primary key + foreign key -> A.id
p2: sth
Table C:
id: primary key + foreign key -> B.id
p3: sth
これには、BまたはCを完全に取得するための結合が必要になります。
または、各拡張機能に基本クラスのプロパティをミラーリングさせることもできます。
Table A:
id: primary key
p1: sth
Table B:
id: primary key + foreign key -> A.id
p1: sth
p2: sth
Table C:
id: primary key + foreign key -> B.id
p1: sth
p2: sth
p3: sth
ここでは、結合なしで任意のクラスを取得できますが、データは複製され、一貫性を保つ必要があります。
どのソリューションを使用できるかは、データを取得する方法と、バージョン1での結合のオーバーヘッドまたはバージョン2でのデータの複数回の書き込みのオーバーヘッドに耐えられるかどうかによって大きく異なります。
また、テーブルにメタ列を追加して、行に拡張子があるかどうかを確認しました。これは、一部のクエリに役立ちます。
Table A:
id: primary key
p1: sth
class: A,B,C
Table B:
id: primary key
p2: sth
class: B,C
Table C:
id: primary key
p2: sth
class: C