2016-03-19 4 views
0

Ich richte eine Datenbank für einen Computerladen ein. In der Datenbank habe ich eine Tabelle namens computer_system, die ein Array-Attribut hat. In der Anordnung diese Komponenten gehen: cpu ram Fall Mainboard GrafikkarteWie man eine bedingte Bedingung in postgreSQL setzt

Nun zum schwierigen Teil: Die verschiedenen Komponenten haben ihre eigenen Tabellen und alle untergeordneten Tabellen einer Tabelle namens Komponente. Die Mainboard-Tabelle hat ein Attribut namens "on-board graphics". Wenn es eine Grafikkarte hat, wird sie hier aufgelistet. Wenn nicht, ist das Attribut null.

Jetzt, wenn ich Komponenten in die Computer_System-Tabelle einfügen, brauche ich Postgres, um zu überprüfen, ob das Mainboard übergeben wurde, hat eine Onboard-Grafikkarte. Wenn nicht, muss eine Grafikkarte hinzugefügt werden, bevor die Abfrage erfolgreich ausgeführt werden kann. Wie füge ich diese Einschränkung hinzu?

Ich habe versucht, mein Problem so gut wie möglich zu erklären, und ich habe alle meine Bücher überprüft, aber ich kann die Antwort darauf nicht finden. Frag mich, ob etwas unklar ist. Auch hier ist ein unfertiges ER-Diagramm I für diese Datenbank

http://i.stack.imgur.com/zAT0f.png

EDIT gemacht habe: Mit anderen Worten, was ich tun möchte, ist, wenn mainboard.on_board_graphics NULL ist, dann kann graphics_card nicht sein NULL.

+0

Komponenten und ihre Eigenschaften ändern sich so schnell, dass Sie Ihr Schema jeden Tag neu gestalten müssen. Sieht so aus, als wäre das JSON-Format dafür geeigneter, mit Einschränkungen auf der Anwendungsseite. –

+0

@EgorRogov Dies ist eine Schulaufgabe, also muss ich die Datenbank nicht aktualisieren, abhängig von den Eigenschaften der Komponenten in der realen Welt :) – yeahboy

+0

Nun, ohne Ihre Tabellen zu sehen, ist es schwer, etwas zu empfehlen. Aber wenn Sie maximal eine Grafikkarte an ein Motherboard anschließen, können Sie FK wie folgt haben: 'mainboard.graphics_card_id verweist auf Grafikkarte (id)'. Dann können Sie constraint 'check hinzufügen ((on_board_graphics is not null) oder (graphics_card_id ist nicht null))'. –

Antwort

1

Der offensichtliche Weg besteht darin, einen CHECK-Constrain durchzuführen, der graphics_card und on_board_graphics nicht gleichzeitig null sein lässt. Aber on_board_graphics befindet sich in einer anderen Tabelle, und da postgresql Unterabfragen in CHECKs nicht zulässt, war dies keine Lösung.

Ich löste dies durch eine Funktion und einen Trigger wie folgt ergänzt:

CREATE FUNCTION graphics_guaranteed() RETURNS TRIGGER AS $$ 
BEGIN 

IF 
(SELECT on_board FROM mainboard WHERE NEW.mainboard = mainboard.name) IS NULL 
AND 
NEW.graphics_card IS NULL 
THEN 
RAISE EXCEPTION 'graphics not found'; 
END IF; 
RETURN NEW; 
END; 
$$ LANGUAGE plpgsql; 

CREATE TRIGGER graphics_trigger 
AFTER UPDATE OR INSERT ON computer_system 
FOR EACH ROW 
EXECUTE PROCEDURE graphics_guaranteed(); 

hoffe, das hilft, wenn jemand anderes auf dem gleichen Problem stolpert.

Verwandte Themen