8

この状況を考えてみましょう。は営業担当者から購入されます営業担当者はショールーム(および1つのショールームのみ)で働いています。ショールームはメーカーと提携しており、そのメーカーが製造した車のみを販売しています。同時に、車は特定のモデルのものであり、モデルはメーカーによって作成されます。

制限事項R:車のモデルの製造元は、車の販売員のショールームの関連製造元と同じ製造元である必要があります。

この図は、明らかな外部キーの関係を示しています。

     ---->  Manufacturer  <----
     |                        |
     |                        |
 Showroom                     |
     ^                        |
     |                      Model
     |                        ^
Salesperson                   |
     ^                        |
     |                        |
     ---------  Car  ----------

制限Rをどのように実施しますか?外部キー関係を追加できますCar --> Manufacturer。それでも、自動車のメーカーは、「ダイアモンド」の周りで何らかの方法でテーブルを結合することによって確立できるので、これを行うことは確実に正規化されませんか?それでも、制約を適用する方法は他にわかりません。

4

2 に答える 2

4

ダイアモンドの「下部」が、最終的にダイアモンドの別の「上部」につながるダイアモンドの「側面」を参照できないようにする方法は、識別関係と結果として生じる「太い」自然キーを使用することです。下部でマージできます:

ここに画像の説明を入力してください

(簡潔にするために、PKフィールドのみを示しています。ほぼ確実に、代替キーとして車両識別番号が必要になりますCar...)

ManufacturerIdダイアモンドの両側に移動し、最終的に下部で1つのフィールドにマージされました。それが単一のファイルであるという事実は、同じ車につながる2つのメーカーが存在することはできないことを保証します。

ところで、DBMSが代替キーへのFKをサポートしていると仮定すると、これでも(これらのナチュラルに加えて)代理キーの使用を妨げることはありません。

ここに画像の説明を入力してください

このモデルを単独で使用すると、サロゲートは冗長になりますが、表示されていない他のエンティティが存在する可能性があります。これにより、よりスリムなFKを使用することでメリットが得られる可能性があります。


上記は、車が販売された車としてのみ存在する、図の最も直接的な変換です。ただ、まだ売れていない車は収納したいのではないかと思いますが、売れたら車の買い手などを覚えておいてください…

したがって、より完全なモデルは次のようになります。

ここに画像の説明を入力してください

識別関係のトリックをすすぎ、繰り返すだけなので、別のメーカーのショールームに車を展示したり、別のショールームの営業担当者が車を販売したりすることはできません。

に列がある場合、車は売れ残りCarです。Car に行があり、に対応する行がある場合、車が販売されSaleます。CarSaleは同じPKを共有し、これは「1対0..1」の関係です。これは、とをマージし、販売のフィールドをNULL可能にし、適切なチェックを行って「部分的にNULL」にならないようにすることでモデル化することもできCarますSale。 。

ところで、あなたが何かを売っているときはいつでも、あなたはその販売が「時間内に凍結されている」ことを確認する必要があります。たとえば、販売に車の価格が変わったからといって、購入者が実際に支払う価格は変わらないはずです。詳細については、こちらをご覧ください。

于 2012-09-06T11:55:03.873 に答える
3

私が質問を正しく理解していれば、これは近いはずです。

ここに画像の説明を入力してください

キーの詳細は次のとおりです

--
-- Keys for SalesPerson
--
alter table SalesPerson
  add constraint PK_salesperson primary key (PersonID)

, add constraint AK1_salesperson unique (ManufacturerID, ShowRoomNo, PersonID) 

, add constraint FK1_salesperson foreign key (PersonID)
                           references Person (PersonID)

, add constraint FK2_salesperson foreign key (ManufacturerID, ShowRoomNo)
                         references ShowRoom (ManufacturerID, ShowRoomNo)
;

--
-- keys for Sale table
--
alter table Sale
  add constraint PK_sale primary key (SaleID)

, add constraint FK1_sale foreign key (BuyerID)
                    references Person (PersonID)

, add constraint FK2_sale foreign key (ManufacturerID, ModelName, ShowRoomNo)
                references CarDisplay (ManufacturerID, ModelName, ShowRoomNo)

, add constraint FK3_sale foreign key (ManufacturerID, ShowRoomNo, SalesPersonID)
               references SalesPerson (ManufacturerID, ShowRoomNo, PersonID)
;
于 2012-09-05T20:41:30.323 に答える