Lösung für Ihre Frage
Angenommen, Sie möchten das durchsetzen:
"Id_Lot"
existiert tatsächlich in"Lot"."Code"
. -> FK-Einschränkung"Lot"."Empty"
für den Spot istTRUE
nur zum Zeitpunkt der Überprüfung.
Sie könnten tun Sie dies mit einem NOT VALID
CHECK
Einschränkung mit einem gefälschten IMMUTABLE
Funktion, um die andere Tabelle zu überprüfen. Einzelheiten:
Aber Ihr Datenmodell ist in einigen Aspekten wackelig. Ich würde einen viel saubereren Ansatz vorschlagen.
Saubereres Design mit Ausschlussbeschränkung
Speichern Sie nicht redundant mit, ob ein Grundstück gerade leer ist. Das ist sehr fehleranfällig und anfällig für Parallelitätsprobleme. Erzwingen Sie, dass jedes Los nur einmal gleichzeitig mit einem Ausschlussbeschränkung
. Damit das funktioniert, speichere den Zeitpunkt der Ausfahrt in ticket
, zusätzlich.
CREATE TABLE lot (
lot_id varchar(4) NOT NULL PRIMARY KEY -- I would use integer if possible
, lot_type text NOT NULL
);
Kein redundanter aktueller Zustand im lot
Tabelle.
Damit die Ausschlussbeschränkung funktioniert, benötigen Sie das zusätzliche Modul btree_gist . Detaillierte Anleitung:
- 'One-to-Many'-Beziehungsintegritätsproblem für Zeitbereiche
- Speichern Sie die Wochentag und Uhrzeit?
CREATE TABLE ticket (
ticket_id serial PRIMARY KEY
, during tsrange NOT NULL
, license_plate text NOT NULL REFERENCES "Vehicle"("L_Plate"),
, lot_id int NOT NULL REFERENCES lot
, CONSTRAINT lot_uni_ticket EXCLUDE USING gist (lot_id WITH =, during WITH &&)
, CONSTRAINT during_lower_bound_not_null CHECK (NOT lower_inf(during))
, CONSTRAINT during_bounds CHECK (lower_inc(during) AND NOT upper_inc(during))
);
-
Verwenden Sie einen Zeitstempelbereichsdatentyp
tsrange
für die Parkdauerduring
.Eingabe mit oberer Grenze NULL, wenn das Auto einfährt. Aktualisierung mit Obergrenze bei Ausfahrt des Autos. Dies ermöglicht unter anderem auch das Parken von Autos über mehrere Tage. -
Einige zusätzliche
CHECK
Einschränkungen, um grundlegende Regeln fürduring
durchzusetzen :- Inklusive Untergrenze, exklusive Obergrenze, um konsistent zu bleiben.
- Die untere Grenze (Eingang) darf nie fehlen.
Verwandte: