2016-03-18 10 views
1

ich das nächste Design Zweifel haben:Machen Sie einen Eintrag obligatorisch, wenn in einer Tabelle existieren

Ich habe athlete Einheit kann die athlete viele Nationalitäten haben, so habe ich zweite Tabelle countries genannt. Dann gibt es zwischen athlete und countries eine Viele-zu-Viele-Beziehung. Ich erstelle eine andere Tabelle athlete_country, um die Viele-zu-Viele-Beziehung aufzulösen.

Meine Frage: Gibt es eine Möglichkeit zu erreichen, dass athlete_country Eintrag für einen Eintrag in der athlete Tabelle obligatorisch sein muss?

Ich arbeite an postgresql. Gibt es einen Weg in einem anderen Datenbankserver?

Antwort

1

Nein, dies ist aus logischen Gründen nicht möglich: athlet_country tables verweist auf die athlet-Tabelle, und wenn Sie eine Referenz zurückgeben (Sie können das tun), können Sie auch keine Zeile einfügen Tabelle, da jede Zeile auf die Zeile in einer anderen Tabelle verweisen soll, die noch nicht eingefügt ist.

Die Lösung besteht darin, zusätzlich zu vielen-zu-vielen, die Sie beschrieben haben, eine Viele-zu-Eins-Beziehung zu verwenden. Sie können z. B. das Feld "primary_country" zur athlet-Tabelle hinzufügen, die direkt auf die Landtabelle verweist. In diesem Fall können Sie sicher sein, dass jeder Athlet eine Beziehung zu mindestens einem Land hat, das im Feld "primary_country" angegeben ist, und optional mit anderen Ländern, die in der Tabelle athlet_country aufgeführt sind.

create table country(id serial primary key, name text); 
create table athlete(id serial primary key, name text, primary_country int references country(id)); 
create table athlete_country(athlete_id int references athlete(id), country_id int references country(id), primary key (athlete_id, country_id)); 
Verwandte Themen