0

交通局のデータベースを設計することを検討してください。違反、合法性、および推進要因の表があります。

合法性の表には、罰金の費用、条項番号、説明、理由などの属性があります。

将来、コストと条項の番号を変更する場合、これが既存のレコードに影響を与えないようにします。ただし、テーブルの違反と合法性はすでに関係しているため、クエリを実行すると古いレコードが変更されます。

私の懸念を説明するために簡単な例を挙げましたが、そのような場合を解決するための概念を知りたいと思います。

これを行う方法?

アップデート1)

いくつかの答えが正しい方向に進んでいないので、私が欲しいものを正確に説明しなかったのではないかと思います。したがって、私は説明します:私は以下のためのエンティティを持っています:

violation, committee, decision, meeting, and legal terms

関係1は言う:committeeaを保持し、xに関してmeeting取る。他の関係は言う:に基づいて取られた。decisionviolationdecisionlegal terms

ここで、「法的条件」の表の詳細に立ち入ることなく、罰金、法的条項、参照などの属性があると仮定します。ある日、条項「abc」の罰金を50ドルではなく100ドルに変更した場合。罰金が「abc」という条項に基づいていた古い違反の記録を取得します。コストは$50と表示されるはずですが、$100と表示されます。

4

4 に答える 4

1

この状況に対処する方法は次のとおりです。

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

于 2013-03-19T17:46:22.143 に答える
1

この方法で行のデータを保持する場合、たとえば、注文または請求書の製品の価格を保持する場合は、値を行に格納するだけの、かなり標準的なアプローチです。不変であり、価値を維持することが非常に重要であるデータの場合、これが私が推奨するアプローチです。

于 2013-03-19T17:53:14.743 に答える
0

あなたの例をとると、

合法性の表には、罰金の費用、条項番号、説明、理由などの属性があります。

将来、コストと条項の番号を変更する場合、これが既存のレコードに影響を与えないようにします。

それでは、Legalitiesテーブルを定義しましょう。

Legalities
----------
Legalities ID
Explantion
Reason
etc

Legalities IDは、プライマリ(クラスタリング)キーです。これは、昇順の整数または長整数、あるいはその他のUIDです。

節テーブルを定義します。コストと条項を一緒に変更すると仮定します。

Clause
------
Clause ID
Legalities ID
Date written
Clause
Cost

条項IDは、プライマリ(クラスタリング)キーです。これは、昇順の整数または長整数、あるいはその他のUIDです。

(リーガルID、降順で書かれた日付)に一意のインデックスを定義します。そうすれば、取得された最初の行が最新の句とコストになります。

変更の履歴を保持する列に対して、Clauseのようなテーブルを定義します。

于 2013-03-19T17:54:16.437 に答える
-1

解決策は、テーブルを正規化することです。概念の良い説明は次のとおりです。Explain_normalization_with_examples

于 2013-03-19T17:51:44.207 に答える