web-dev-qa-db-ja.com

単一および多重継承ハードコードされた一般化物理データモデル中の子(派生)テーブルPK / FKの適切な実装

以下は、エンティティのハードコードされた一般化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を指す)にします。

enter image description here

1
MacGyver

私はこれを(単一の継承のために)次のように解決しました:

クラスの各拡張機能は、その主キーとして基本クラスの主キーを継承し、常にその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
1
greenone83