Solusi untuk pertanyaan Anda
Dengan asumsi Anda ingin menerapkannya:
"Id_Lot"
sebenarnya ada di"Lot"."Code"
. -> Batasan FK"Lot"."Empty"
untuk tempatnya adalahTRUE
pada saat cek saja.
Anda bisa lakukan ini dengan NOT VALID
CHECK
batasan menggunakan IMMUTABLE
fake palsu berfungsi untuk memeriksa di meja lain. Detail:
Tetapi model data Anda goyah dalam beberapa aspek. Saya akan menyarankan pendekatan yang lebih bersih.
Desain yang lebih bersih dengan batasan pengecualian
Jangan menyimpan apakah banyak saat ini kosong secara berlebihan dengan banyak. Itu sangat rawan kesalahan dan rentan terhadap masalah konkurensi. Terapkan bahwa setiap lot hanya dapat diambil sekali dalam satu waktu dengan batasan pengecualian
. Agar itu berfungsi, simpan waktu keluar di ticket
, sebagai tambahan.
CREATE TABLE lot (
lot_id varchar(4) NOT NULL PRIMARY KEY -- I would use integer if possible
, lot_type text NOT NULL
);
Tidak ada status redundan saat ini di lot
tabel.
Agar batasan pengecualian berfungsi, Anda memerlukan modul tambahan btree_gist . Instruksi terperinci:
- masalah integritas relasi 'satu-ke-banyak' untuk rentang waktu
- Simpan hari dalam seminggu dan waktu?
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))
);
-
Menggunakan jenis data rentang stempel waktu
tsrange
untuk durasi parkirduring
.Masuk dengan NULL batas atas, saat mobil masuk. Perbarui dengan batas atas saat mobil keluar. Antara lain, ini juga memungkinkan mobil untuk parkir beberapa hari. -
Beberapa tambahan
CHECK
batasan untuk menegakkan aturan dasar padaduring
:- Batas bawah inklusif, batas atas eksklusif agar tetap konsisten.
- Batas bawah (pintu masuk) tidak akan pernah hilang.
Terkait: