12

バスの予約モジュールを開発していますが、適切なデータベース構造を設計するのに問題があります。

次の場合を考えてみましょう。
バスはAからDに行き、BとCで途中降機します。乗客はどのルートのチケットも予約できます。AからB、CからD、AからDなど。

したがって、各ルートには多くの「サブルート」を含めることができ、大きいルートには小さいサブルートを含めることができます。

空席を簡単に検索できるように、ルートと停車地のテーブル構造を設計したいと思います。したがって、誰かがAからBの座席を予約した場合でも、BからCまたはDの座席は引き続き利用できます。

すべてのアイデアをいただければ幸いです。

4

2 に答える 2

15

私はおそらく、この基本的な考え方に似た「ブルートフォース」構造を採用するでしょう。

ここに画像の説明を入力してください

(実際のモデルにはさらに多くのフィールドが存在する必要があります。これは、テーブル間の関係を確立するために必要な最低限の要素を含む単純化されたバージョンにすぎません。)

チケットの「カバー」はTICKET_STOPテーブルを介して停止します。たとえば、チケットが3つのストップをカバーする場合、TICKET_STOPにはそのチケットに関連する3つの行が含まれます。そのチケットでカバーされていない他の2つの停車地がある場合、そこに関連する行はありませんが、別のチケットがこれらの停車地をカバーすることを妨げるものは何もありません。

自由な使用法または自然キー/識別関係により、2つのチケットが同じ座席/停車地の組み合わせをカバーできないことが保証されます。TICKET_STOPテーブルで、LINE.LINE_IDがひし形の依存関係の両端に沿ってどのように「移行」し、下部でのみマージされるかを確認します。

このモデル自体では、単一のチケットが一部の停車地を「スキップ」するなどの異常から保護することはできません。アプリケーションロジックを介していくつかのルールを適用する必要があります。ただし、次のように、旅行のどの部分でどの座席が空いているかをかなり簡単かつ迅速に判断できるようにする必要があります。

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
    )

(パラメータプレフィックス:をDBMSに適したものに置き換えます。)

このクエリは基本的に、特定の路線とバスの停車地と座席のすべての組み合わせを生成し、特定の旅行でチケットによってすでに「カバー」されているものを破棄します。「カバーされていない」ままのそれらの組み合わせは、その旅行のために無料です。

次の項目を簡単に追加できます。STOP.STOP_NO IN ( ... )または句に追加SEAT.SEAT_NO IN ( ... )してWHERE、特定の停車地または座席での検索を制限します。

于 2012-04-10T23:32:38.177 に答える
10

バス会社の観点から:

通常、1つのルートは、AからB、BからC、CからDなどの一連のセクションと見なされます。塗りつぶしは、これらのセクションごとに個別に計算されます。したがって、バスがAから出発し、人々がCで出発する場合、ユーザーはCでチケットを購入できます。

このように計算すると、各ルートにはIDがあり、各セクションはこのルートIDに属します。次に、ユーザーが複数のセクションのチケットを購入した場合、各セクションにマークが付けられます。次に、次の乗客システムのために、途中のすべてのセクションが利用可能かどうかを確認します。

于 2012-04-27T11:25:59.310 に答える