この状況に対処する方法は次のとおりです。
- まず第一に、あなたの
Violations
テーブルには違反が発生した日付があると仮定しています。そうでない場合は、持っている必要があります。
Clause
とCost
エンティティは別々なので、別々のテーブルにある必要があります。
Violations
テーブルにはClauses
、個々の句を識別する主キーへの外部キー参照が必要です。これにより、条項番号が変更された場合でも、違反テーブルで正しい条項を参照できるようになります。
- テーブルには、
Costs
各コストレコードが条項に関連付けられている条項テーブルIEへの外部キー参照が必要です。
- テーブルには
Costs
、価格がいつ有効になるかを識別する日付列が必要です。このようにして、条項に複数の価格レコードを含めることができます(ただし、1つだけが「有効な」IEと見なされ、最新の有効な開始日を持つものと見なされます)。
- これは、テーブル内のデータの有効性に影響を与えることなく、条項番号と価格の両方を互いに独立して変更できることを意味し
Violations
ます。
スキーマは次のようになります。

次に、違反を照会するときに、違反が発生した日付より前の最新の条項価格を引き出すだけです。
例として、次のデータを含む単一の句があるとします。
Id Code Description
---------------------------------
1 101 Speeding
条項には、次のコストレコードを関連付けることができます。
Id Cost Valid From ClauseId
------------------------------------------------
1 $60 01/01/2013 1
2 $70 01/02/2013 1
3 $80 01/03/2013 1
したがって、上記のコストはすべて「スピード違反」条項に関連しています。現在のコストを知りたい場合は、条項に関連付けられ、最新の有効な開始日を持つレコードをコストテーブルから選択すると、$80が得られます。
ここで、次の違反があったと想像してください。
Id Name ClauseId Date Occurred
---------------------------------------------------
1 Benjamin 1 16/02/2013
この違反が発生した時点での費用は70ドルでした。したがって、正しい価格で違反レコードを選択するには、違反、条項、およびコストのテーブルを結合するクエリを構成する必要があります。有効なコストが違反が発生した日付よりも少ないレコードのみを選択します。
これにより、次の結果が得られます。
Name Date Occurred Description cost Valid From
--------------------------------------------------------------------------
Benjamin 16/02/2013 Speeding $60 01/01/2013
Benjamin 16/02/2013 Speeding $70 01/02/2013
次に、有効な最大の開始日を持つレコードを選択するだけで、1つの行が残り、この違反が発生した時点での正しい価格は70ドルになります。