0

一意のインデックス用にテーブルを構造化する際の問題を回避する方法を見つけるのに苦労しています。

アイテムが予約されているテーブルがあり、構成するために使用されるいくつかのフィールドがあります

ItemID - INT
Date - DATE
TimeOfDay - INT (morning = 1, afternoon = 2)
ReservationStatus - VARCHAR (expired, cancelled, confirmed, cancelled by admin)

問題は ReservationStatus フィールドにあります。システムはキャンセルされた複数の行を許可する必要がありますが、確認済みまたは期限切れの行は 1 つだけです (アプリは確認済みから期限切れに変わります)。私はアイデアがありません。どんな助けもいただければ幸いです。

編集:

完全なテーブル構造

ReservationID - PK Auto-incrementing Integer
SubItemID - INT FK
MemberID - INT FK
Date - DATE
TimeOfDay - INT
ReservationStatus - VARCHAR

SubItemID、Date、TimeOfDay、ReservationStatus は一意である必要があります。複数のメンバーが同じ日の午後に同じ SubItem を予約することはできません。

私は自分のアプリでこれを検証しますが、テーブル構造を介して (プログラマーのエラーの場合に) 整合性を確保したいと考えています。

4

1 に答える 1

2

ユニーク キー制約を使用してこのテーブル構造にこのビジネス ルールを実装するには、少し不自然なことを行う必要があります。

CancellationCode という列を追加できます。INTにします。その列の値 0 を予約してアクティブ/期限切れを意味し、それをデフォルト値にします。次に、予約をキャンセルする場合は、その行の CancellationCode にゼロ以外の一意の値を割り当てます。そのために行で ReservationID 値を使用するか、独自の一意の ID を持つ Cancellation テーブルを使用できます。

ReservationStatus 列を保持できるので、予約の状況がわかります。ただし、有効/期限切れの予約を検索するWHERE CancellationCode = 0場合は、CancellationCode と ReservationStatus が同期されない場合に備えて を使用してください。

次に、(SubItemId、Date、TimeOfDay、CancellationNumber) の一意のインデックスを作成します。これにより、既存の行と同じ SubItemId、Date、TimeOfDay 値の組み合わせに対して新しいアクティブな予約行を挿入しようとする試みが失敗します。

于 2013-10-31T17:49:16.653 に答える