Løsning på det, du spørger om
Forudsat at du vil håndhæve det:
"Id_Lot"
eksisterer faktisk i"Lot"."Code"
. -> FK-begrænsning"Lot"."Empty"
for stedet erTRUE
kun på tidspunktet for kontrollen.
Du kunne gør dette med en NOT VALID
CHECK
begrænsning ved hjælp af en falsk IMMUTABLE
funktion til at kontrollere på den anden tabel. Detaljer:
Men din datamodel er rystende i en række aspekter. Jeg vil foreslå en meget renere tilgang.
Renere design med udelukkelsesbegrænsning
Gem ikke, om en vare i øjeblikket er tom redundant sammen med varen. Det er meget fejltilbøjeligt og følsomt over for samtidighedsproblemer. Håndhæv, at hvert parti kun kan tages én gang ad gangen med en ekskluderingsbegrænsning
. For at det skal virke, skal du gemme tidspunktet for udgang i ticket
, desuden.
CREATE TABLE lot (
lot_id varchar(4) NOT NULL PRIMARY KEY -- I would use integer if possible
, lot_type text NOT NULL
);
Ingen redundant aktuel tilstand i lot
tabel.
For at udelukkelsesbegrænsningen skal fungere, skal du bruge det ekstra modul btree_gist . Detaljerede instruktioner:
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))
);
-
Brug af et tidsstempelområde datatype
tsrange
for parkeringsvarighedenduring
. Indtast med øvre grænse NULL, når bilen kommer ind. Opdater med øvre grænse, når bilen kører ud. Dette gør det blandt andet også muligt for biler at parkere flere dage. -
Nogle ekstra
CHECK
begrænsninger for at håndhæve grundlæggende regler påduring
:- Inklusive nedre grænse, eksklusiv øvre grænse for at forblive konsistent.
- Den nedre grænse (indgangen) må aldrig mangle.
Relateret: