次のシナリオを検討してください。ペットの飼い主は複数の猫を飼っている場合もあれば、複数の犬を飼っている場合もあります。一部の犬は、同じ所有者の一部の猫と関係があります (つまり、ケンカします:-)) 。
次のリレーショナル設計では、異なる所有者の猫と犬が関連している可能性があるため、この制限はありません。リレーショナル設計によってこの制限を課す方法はありますか?
次のシナリオを検討してください。ペットの飼い主は複数の猫を飼っている場合もあれば、複数の犬を飼っている場合もあります。一部の犬は、同じ所有者の一部の猫と関係があります (つまり、ケンカします:-)) 。
次のリレーショナル設計では、異なる所有者の猫と犬が関連している可能性があるため、この制限はありません。リレーショナル設計によってこの制限を課す方法はありますか?
識別関係を使用して、所有者の PK を菱形の依存関係の「側面」と「底」の両方に移行する必要があります。
は 1 つのフィールドにすぎないためCatDog.OwnerId
、行ごとに複数の所有者を識別することはできません。また、両方の種類の動物に対する FK であるため、この 1 つの所有者は猫と犬の両方の所有者と一致する必要があります。
言い換えれば、猫は同じ飼い主の犬にのみ関係を持つことができます。
ご覧のとおり、猫と犬は、おそらく予想していたものとは異なって識別されます。猫は飼い主によって識別され、同じ飼い主の他の猫とは によって区別されますCatNo
。犬についても同様です。
「より単純な」キーが必要な場合は、いつでも代理キーを追加することができます。または、代わりに、UNIQUE 制約を移行する目的でのみ完全に削除CatNo
して「悪用」することもできます。DogNo
OwnerId
(U1
は UNIQUE 制約を示します。)
動物をより簡潔に識別できるようになりましたが、欠点があります。一意性を強制するという観点からすると、UNIQUE 制約は完全に冗長です。これは PK のスーパーセットであり、PK はそれ自体で一意性を適切に強化しています。UNIQUE 制約の唯一の目的は、 (および)CatDog.OwnerId
を参照できるようにすることです。ほとんどの DBMS では、外部キーの親エンドポイントをキーにする必要があります。Cat.OwnerId
Dog.OwnerId
一部の DBMS ( Oracle ) では、1 つのインデックスのみを使用して PK と UNIQUE 制約の両方を適用できますが、ほとんどの場合はそうではありません。インデックスを追加するたびに、挿入/更新/削除のパフォーマンスが低下します。