Giải pháp cho những gì bạn yêu cầu
Giả sử bạn muốn thực thi điều đó:
-
"Id_Lot"
thực sự tồn tại trong"Lot"."Code"
. -> Ràng buộc FK -
"Lot"."Empty"
cho vị trí làTRUE
chỉ vào thời điểm séc.
Bạn có thể thực hiện việc này với NOT VALID
CHECK
hạn chế sử dụng IMMUTABLE
giả chức năng để kiểm tra trên bảng khác. Chi tiết:
Nhưng mô hình dữ liệu của bạn không ổn định ở một số khía cạnh. Tôi sẽ đề xuất một cách tiếp cận rõ ràng hơn nhiều.
Thiết kế gọn gàng hơn với ràng buộc loại trừ
Không lưu trữ cho dù lô hiện đang trống dư thừa với lô. Điều đó rất dễ xảy ra lỗi và dễ bị các vấn đề đồng thời. Thực thi rằng mỗi lô chỉ có thể được lấy một lần với ràng buộc loại trừ
. Để điều đó hoạt động, hãy tiết kiệm thời gian thoát trong ticket
, ngoài ra.
CREATE TABLE lot (
lot_id varchar(4) NOT NULL PRIMARY KEY -- I would use integer if possible
, lot_type text NOT NULL
);
Không có trạng thái hiện tại dư thừa nào trong lot
bảng.
Để ràng buộc loại trừ hoạt động, bạn cần mô-đun bổ sung btree_gist . Hướng dẫn chi tiết:
- vấn đề về tính toàn vẹn của mối quan hệ 'một-nhiều' trong phạm vi thời gian
- Lưu trữ ngày và giờ trong tuần?
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))
);
-
Sử dụng loại dữ liệu phạm vi dấu thời gian
tsrange
cho thời gian đỗ xeduring
Nhập với NULL giới hạn trên, khi ô tô đi vào. Cập nhật giới hạn trên khi ô tô rời khỏi. Ngoài những thứ khác, điều này cũng giúp ô tô có thể đậu nhiều ngày. -
Một số
CHECK
bổ sung các ràng buộc để thực thi các quy tắc cơ bản trênduring
:- Giới hạn dưới bao gồm, giới hạn trên độc quyền để luôn nhất quán.
- Không bao giờ được thiếu giới hạn dưới (lối vào).
Có liên quan: