2

ER図の一部はこちら

ここで、Customer はスーパークラスであり、Private と Business は互いに素の必須参加を持つサブクラスであり、Business のお客様はそれぞれが互いに素の必須参加を持つ Silver、Gold、Diamond サブクラスのスーパークラスです。

簡単に説明すると、顧客はビジネスとプライベートに分かれています。ビジネスのお客様には、シルバー:10% 割引、ゴールド:25% 割引、ダイヤモンド:40% 割引の 3 つのメンバーシップ オプションがあります。上記をリレーショナルスキーマにマッピングする最良の方法は何ですか? 属性と一般属性を区別するものは何ですか? 現在、私は次のことを思いつきました:

4 つのテーブル - PrivateCustomer (Customer スーパークラスから) および SilverMember、GoldMember、DiamondMember (Business スーパークラスから)

PrivateCustomer (CuID, CuFirstName, CuLastName, CuDOB, CompanyName, CuAddressLine1, CuAddressLine2, PhoneNumber, CuEmail, CuNotes, CuLocID)

SilverMember (CuID, ????? DiscPerc, DiscAccrued, CuLocID)

GoldMember (CuID, ???? DiscPerc, DiscAccrued, CuLocID)

DiamondMember (CuID, ???? DiscPerc, DiscAccrued, CuLocID)

CuLocIDは、郵便番号、都市、国に関連する推移的な依存関係を削除するための外部キーです (別のテーブルに格納されている場所の詳細 - tblCuLoc )

4

1 に答える 1

0

まず第一に、あなたの ERM は悪い設計だと思います。ロール パターンをエンティティに入れるのではなく、ロール パターンを使用する方がよいからです。つまり、メンバーシップ オプションSilverGoldおよびDiamondはエンティティではありません。

あなたの質問に答えるには、クラスをマップするための 3 つのオプションがあります。

  1. クラス階層のすべての属性が 1 つのテーブルに入ります (単一テーブルの継承)。
  2. 各クラスのすべての属性は、個別のテーブルに入れられます ( Class Table Inheritance )。
  3. すべての非抽象クラスのすべての属性は、別のテーブルに入れられます (具体的なテーブルの継承)。

しかし、正直なところ、ERM は事前に修正する必要があります。少なくともDiscount Group、属性を持つディスカウント メンバーシップ (例: )Percentageのエンティティを作成し、エンティティとエンティティNameの間に 1 対多の関係を作成する必要があります。サブクラスを使用する代わりに、顧客エンティティ自体にロール パターンを使用することもできます。割引メンバーシップを改善するための UML の ERM としての私の提案は次のとおりです。Business CustomerDiscount Group

元ERMの改善提案

2. アプローチ ( Class Table Inheritance ) などを使用して、これをリレーショナル スキーマにマッピングすると、次の関係が得られます。

  • customer(id, ...)
  • business_customer(id, ...)
  • private_customer(id, ...)
  • discount_membership(customer_id, group_id, discount_accrued)
  • discount_group(id, name, discount_percantage)

多重度を強制するdiscount_membershipには、列に一意の制約を使用し、customer_idもちろん適切な外部キー制約を使用する必要があります。

于 2013-03-23T01:16:51.303 に答える