2017-12-03 2 views
3

Ich habe eine Super Hero SQL-Datenbank mit einer SuperPerson-Tabelle und einer Disaster-Tabelle. Es gibt zwei Beziehungen zwischen SuperPerson und Disaster, Create und Prevent. Die SuperPerson-Tabelle hat eine Disposition-Spalte, die uns sagt, ob sie böse oder gut ist. Wie kann ich es so einrichten, dass nur ein SuperPerson, der gut ist, an der Prevent-Beziehung teilnehmen kann und umgekehrt für die Create-Beziehung?SQL erlaubt einer Entität nur dann an einer Beziehung teilzunehmen, wenn sie bestimmte Anforderungen erfüllt

Ich habe darüber nachgedacht, zwei neue Tabellen zu erstellen, SuperHero und SuperVillian, die auf die SuperPerson-Tabelle verweisen, ist dies die logischste Aufgabe oder gibt es PL/SQL, mit denen ich diese Einschränkung erzwingen kann?

Edit: Here's a link to a schema of the database so far

+0

Wenn nur bestimmte Mitglieder an einer Beziehung teilnehmen können, ist dies ein guter Hinweis darauf, dass Ihr Datenmodell zwei verschiedene Arten von Entitäten zusammenführt. Das PL/SQL, das zum Erzwingen der Einschränkung erforderlich ist, ist normalerweise komplexer als einfach zwei Tabellen zu haben. –

+0

@ JeffreyKemp Das ist wahr, aber in diesem Zusammenhang würde ich SuperPerson in SuperHero und SuperVillian aufteilen, was wenig oder gar keinen Unterschied hätte. Ist das eine Verschwendung von Tischen? –

+0

können Sie nach guter 'SuperPerson' suchen, während Sie eine' Prevent'-Beziehung erstellen und umgekehrt für 'Create'. Warum möchten Sie eine Einschränkung auf Entitätsebene setzen? – Aman

Antwort

1

Das Ideal wäre, den Fremdschlüssel zu definieren, wie:

add constraint fk_disaster_create 
    foreign key (create, 'good') references superperson (superpersonid, disposition); 

Leider sind die Konstanten nicht für solche Referenzen erlaubt. Eine Methode besteht darin, eine feste Spalte mit zwei Werten zu definieren:

alter table disaster add disposition_good varchar2(255) default 'good'; 
alter table disaster add disposition_evil varchar2(255) default 'evil'; 

alter table disaster add constraint fk_disaster_create 
    foreign key (create, 'good') references superperson (superpersonid, disposition); 
+0

Kann ich einen Trigger verwenden, um zu überprüfen, ob die Disposition eines SuperPersons gut/böse ist und einen Fehler ausgibt, wenn nicht? –

+0

@JackCassidy. . . Natürlich können Sie stattdessen Trigger verwenden. –

+0

Ist es möglich, den Wert eines Attributs in einer anderen Tabelle als der, auf die sich der Trigger bezieht, zu überprüfen? Wenn zum Beispiel eine Zeile in die HeroDisaster-Tabelle eingefügt wird, kann ich nach dem Wert von Disposition in der SuperPerson-Tabelle mit der entsprechenden SuperID fragen? –

Verwandte Themen