4

テンポラル データベースの日付を 1 つまたは 2 つのテーブルに格納する必要がありますか? これが正規化に違反していない場合は?

PERSON1 DATE11 DATE21 INFO11 INFO21 DEPRECATED
PERSON2 DATE21 DATE22 INFO21 INFO22 CURRENT
PERSON1 DATE31 DATE32 INFO31 INFO32 CURRENT

DATE1 および DATE2 列は、INFO1 および INFO2 が DATE1 と DATE2 の間の期間に true であることを示します。DATE < TODAY の場合、ファクトは廃止され、ユーザー インターフェイスに表示されなくなりますが、歴史的な目的で削除されるべきではありません。たとえば、INFO11 と INFO21 は非推奨になりました。

このテーブルを分割する必要がありますか? 状態 (非推奨または現在) をテーブルに保存する必要がありますか?

質問をさらに明確にするために、非推奨はビジネスで使用される用語です。「最新ではない」ことを好む場合、問題はセマンティックではなく、SQLクエリについてでもありません。どの設計が違反しているか、正規化ルールに最適かを知りたいだけです(正規化が常に進むべき道ではないことは知っています。それも私の質問ではありません)。

4

3 に答える 3

4

「ノーマライゼーションのルールに違反しているデザインを知りたい」

使用する正規化ルールのセットによって異なります。

通常の形式の最初の違反であり、Date の本では最初の NFの違反である可能性が最も高いのは、「現在の」情報を保持する行の終了日です (将来の日付の情報の可能性を抽象化します):その属性をヌル可能にすると、1NF に違反します。

BCNFの違反は、キーの選択の結果として明らかに発生する可能性があります (非一時的なデータベース設計の場合も同様です - ここでは一時的な側面に違いはありません)。「キーの選択」について: 開始日と終了日を別々に使用する場合 (そして、SQL では他に選択肢がない場合)、2 つのキーを宣言する必要があります。1 つは開始日を含み、もう 1 つは終了日。

もう 1 つの設計上の問題は、複数のデータ列です。この問題は、"Temporal Data and the Relational Model" でかなり広く議論されています: INFO1 と INFO2 が互いに独立して変化する可能性がある場合は、テーブルを分解して 1 つの属性のみを保持することをお勧めします。これは、行内の 1 つの属性が変更されるたびに新しい完全な行を作成する必要がある場合に発生する可能性があります。その場合、あなたが与えたデザインは、「時間データとリレーショナル モデル」で定義されているように、(通常の形式は) SIXTH の標準形式に違反しています。

于 2009-10-04T14:30:09.003 に答える
2

日付の意味を示していません。それらは、(a) 述べられた事実が実際に真実であった期間、または (b) 述べられた事実がデータベースの所有者によって真実であると信じられた期間を指していますか? (b) の場合、私は決してこのようにはしません。更新が完了するとすぐに、更新された行をアーカイブ テーブル/ログに移動します。(a) の場合、次のステートメントは疑わしいです。

「事実は非推奨であり、ユーザーインターフェースに表示されるべきではありません」

ファクトが「ユーザー インターフェイスに表示される必要がない」場合は、データベースに存在する必要もありません。そのような事実をそこに保持すると、1 つのことだけが達成されます。残りのすべての一般的なパフォーマンスが低下します。

要件に合わせてこれらの歴史的な事実の記述が本当に必要な場合は、いわゆる「非推奨の事実」がまだビジネスに非常に関連しているため、「非推奨」ではない可能性があります。このような理由で、データベースに「真に非推奨」のファクトがほとんどないと仮定すると、設計は適切です。運用データベースから定期的に削除することで、「真に非推奨のファクト」の数を少なくしてください。

(PS) あなたのデザインが優れているからといって、問題が起こらないというわけではありません。SQL は、この種の情報をエレガントに処理するには非常に適していません。「Temporal Data and the Relational Model」は、このテーマの優れた扱いです。別の本、Snodgrass の本も、私ではありませんが、よく賞賛されています。これは、この本に関する SO に関する次の会話で証明されているように、SQL でこれらの問題を処理するためのレシピを備えたクックブックのようなものです。

(Q) 「なぜそれを読むのですか?」(A)「あなたが求めたトリガーは135ページにあるからです。」

于 2009-10-04T11:13:48.307 に答える
2

正規化はリレーショナル データベースの概念であり、テンポラル データベースには適用されません。リレーショナル データベースにテンポラル データを格納できないと言っているわけではありません。あなたは間違いなくできます。

ただし、Temporal Database Design を使用する場合は、リレーショナル正規化ではなく、Temporal Normalization の概念が適用されます。

于 2009-10-03T21:42:51.893 に答える