tôi có thể đi với một "brute force" cấu trúc tương tự như ý tưởng cơ bản này:.
(Có rất nhiều lĩnh vực hơn nên tồn tại trong mô hình thực này chỉ có một là đơn giản hóa phiên bản có chứa các yếu tố cần thiết trần cần thiết để thiết lập mối quan hệ giữa các bảng.)
Vé "bao gồm" dừng qua bảng TICKET_STOP, Ví dụ, nếu vé bao gồm 3 điểm dừng, TICKET_STOP sẽ chứa 3 hàng liên quan đến vé. Nếu có 2 điểm dừng khác không được vé đó bao trả, thì sẽ không có hàng liên quan ở đó, nhưng không có gì ngăn cản vé khác nhau từ bao gồm các điểm dừng này.
Sử dụng tự do hoặc khóa tự nhiên/xác định mối quan hệ đảm bảo hai vé không thể bao gồm cùng một kết hợp chỗ ngồi/dừng. Xem cách LINE.LINE_ID "di chuyển" dọc theo cả hai cạnh của phụ thuộc hình kim cương, chỉ được hợp nhất ở dưới cùng của nó, trong bảng TICKET_STOP.
Mô hình này, tự nó sẽ không bảo vệ bạn khỏi những bất thường như một vé "bỏ qua" một số điểm dừng - bạn sẽ phải thực thi một số quy tắc thông qua logic ứng dụng. Tuy nhiên, nó sẽ cho phép cho một quyết tâm khá đơn giản và nhanh chóng trong đó ghế được miễn phí cho những phần nào của chuyến đi, một cái gì đó như thế này:
SELECT *
FROM
STOP CROSS JOIN SEAT
WHERE
STOP.LINE_ID = :line_id
AND SEAT.BUS_NO = :bus_no
AND NOT EXIST (
SELECT *
FROM TICKET_STOP
WHERE
TICKET_STOP.LINE_ID = :line_id
AND TICKET_STOP.BUS_ID = :bus_no
AND TICKET_STOP.TRIP_NO = :trip_no
AND TICKET_STOP.SEAT_NO = SEAT.SEAT_NO
AND TICKET_STOP.STOP_NO = STOP.STOP_NO
)
(Thay thế các tham số prefix :
với những gì là thích hợp cho DBMS của bạn.)
Truy vấn này về cơ bản tạo ra tất cả kết hợp điểm dừng và chỗ ngồi cho tuyến và xe buýt nhất định, sau đó loại bỏ những vé đã được "bao phủ" bởi một số vé trong chuyến đi nhất định. Những kết hợp đó vẫn còn "phát hiện" là miễn phí cho chuyến đi đó.
Bạn có thể dễ dàng thêm: STOP.STOP_NO IN (...)
hoặc SEAT.SEAT_NO IN (...)
vào mệnh đề WHERE
để hạn chế tìm kiếm trên các điểm dừng hoặc chỗ cụ thể.
Nguồn
2012-04-10 23:32:38
Bạn đã thử gì? Chỉnh sửa câu hỏi của bạn và dán vào các câu lệnh DDL (câu lệnh SQL CREATE TABLE) của bạn và một số dữ liệu mẫu dưới dạng câu lệnh SQL INSERT. –