2012-04-10 49 views
5

Tôi đang phát triển mô-đun đặt chỗ cho xe buýt và tôi gặp khó khăn khi thiết kế cấu trúc cơ sở dữ liệu phù hợp cho nó.Thiết kế cơ sở dữ liệu cho đặt chỗ xe buýt

Hãy chọn trường hợp sau:
Xe buýt đi từ A đến D với điểm dừng tại B và C. Hành khách có thể đặt vé cho bất kỳ tuyến đường nào, ví dụ: từ A đến B, C đến D, A đến D, v.v.

Vì vậy, mỗi tuyến đường có thể có nhiều "chương trình con" và lớn hơn chứa các tuyến con nhỏ hơn.

Tôi muốn thiết kế cấu trúc bảng cho các tuyến đường và dừng theo cách giúp dễ dàng tìm kiếm chỗ ngồi miễn phí. Vì vậy, nếu ai đó dự trữ chỗ ngồi từ A đến B, thì chỗ ngồi từ B đến C hoặc D sẽ vẫn có sẵn.

Tất cả ý tưởng sẽ được đánh giá cao.

+0

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. –

Trả lời

8

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:.

enter image description here

(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 . 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ể.

5

Từ góc nhìn của công ty xe buýt:

Thông thường một con đường được coi là hàng loạt các bộ phận, như A đến B, B đến C, C đến D, vv điền được tính trên từng phần riêng biệt . Vì vậy, nếu xe buýt rời khỏi A đầy đủ, và mọi người để lại tại C, sau đó người dùng có thể mua vé tại C.

Chúng tôi tính toán theo cách này, mỗi tuyến có ID và mỗi phần thuộc ID tuyến đường này. Sau đó, nếu người dùng mua vé cho nhiều hơn một phần, thì mỗi phần được đánh dấu. Sau đó, cho hệ thống hành khách tiếp theo kiểm tra nếu tất cả các phần trên đường đi có sẵn.

Các vấn đề liên quan