Nein.
Ich würde sagen, dass es sicherlich Fälle gibt, in denen Einzelfeldschlüssel zusammengesetzten Schlüsseln unterlegen sind, zumindest für den Zweck von Fremdschlüsseln . Das heißt nicht, dass Sie auch keinen Ersatzschlüssel mit einem einzigen Feld haben sollten, aber ich persönlich bevorzuge den Schlüssel, der am häufigsten als Ziel eines Fremdschlüssels verwendet wird, der als Primärschlüssel bezeichnet wird
Ich werde versuchen, meinen Standpunkt in den folgenden Beispielen zu veranschaulichen, in denen:
brand
ist eine Automarke, zB Ford, Toyota usw
dealer
ist ein physischer Händler, der an eine Marke gebunden ist (z. B. ein Ford-Händler, der nur Fords verkauft)
model
ist der Autotyp zB Ford Focus, Ford Fiesta etc
stock
ist die aktuelle Anzahl der Vorplatzfahrzeuge für jedes Autohaus
Wenn wir einen Einzelfeld-Ersatzschlüssel für dealer
und model
wie folgt erstellen :
create table brand( brand_id integer primary key );
create table dealer( dealer_id integer primary key,
brand_id integer references brand )
create table model( model_id integer primary key,
brand_id integer references brand )
create table stock( model_id integer references model,
dealer_id integer references dealer,
quantity integer,
primary key(model_id, dealer_id) )
dann ist es möglich, eine Reihe einzufügen stock
, die einen Ford dealer
mit einem "Toyota" -Modell verbindet. Das Hinzufügen brand_id references brand
zu stock
macht das Problem nur noch schlimmer. Auf der anderen Seite, wenn wir den Fremdschlüssel als Teil des Primärschlüssels behalten, wie folgt:
create table brand( brand_id integer primary key );
create table dealer( brand_id integer references brand,
dealer_id integer,
primary key(brand_id, dealer_id) )
create table model( brand_id integer references brand,
model_id integer,
primary key(brand_id, model_id) )
create table stock( brand_id integer,
model_id integer,
dealer_id integer,
quantity integer,
primary key(brand_id, model_id, dealer_id),
foreign key(brand_id, model_id) references model,
foreign key(brand_id, dealer_id) references dealer )
Jetzt wird die Regel, dass "Ford" -Händler nur "Ford" -Autos auf Lager haben dürfen, vom Modell auf natürliche Weise durchgesetzt.
Beachten Sie, dass in dem Beispiel für 'zusammengesetzte Schlüssel' dealer_id
je nach Vorliebe möglicherweise eindeutig ist oder nicht. Es muss nicht eindeutig sein (dh ein alternativer Schlüssel), aber es geht sehr wenig verloren, wenn man es so anlegt (vielleicht ein wenig Speicherplatz), und es kann sehr praktisch sein, so wie ich es normalerweise einrichte, zB:
create table dealer( brand_id integer references brand,
dealer_id serial unique,
primary key(brand_id, dealer_id) )