4

しばらく研究していたデータベース設計の問題がありますが、適切な答えを得ることができません。次のように、2つのテーブルがあるhouse_schemahouseします。

house_schema {
      id big int,
      house_height int,
      house_width int,
      house_decoration vchar(1024),
      build_date  timestamp,
      primary key id,
}

house {
      id big int,
      owner vchar(255),
      price big int,
      house_schema_id big int,
      primary key id,
      foreign key fk_house_house_schema_id (`house_schema_id`) reference `house_schema`.`id`
}

テーブルには、のhouse_schemaいくつかの物理属性が格納されますhouse。ソフトウェアUIで、ユーザーはスキーマを選択し、[ビルド]ボタンをクリックします。家が建てられ、に保管されhouseます。house_schema家がどのように建てられるべきかを説明するような他のいくつかの表があります。

シンプルなデザインでは、外部キーがうまく機能しているように見えます。ただし、ビルダーが古いと思われるスキーマを削除することを決定した場合、問題が発生します。スキーマから構築された家がすでにいくつかあり、外部キーによって削除できません。外部キーをに変更するDELETE ON CASCADEと、それらの家はそれが構築された情報を失います。

この問題を処理するための最良のデザインパターンは何ですか?私が想像できるのは、の複製テーブルがあることですhouse_schema。家が建てられたら、その行をhouse_schema複製テーブルにコピーします。

ただし、。を含む複数の類似したテーブルがあるため、データベース内に多数の重複テーブルが発生しますhouse_schema。データベースの正規化ルールに違反しているようです。

誰か良い考えがありますか?

4

5 に答える 5

3

家を建てるために使用されたスキーマの履歴を保持したい場合、一般的な解決策は、テーブルに論理的な削除を実装することです。house_schema

実際に行を削除する代わりにhouse_schema

  • Activeテーブルに列を追加する
  • falseスキーマが廃止されたときにこの列を設定します
  • アプリケーションを調整して、非アクティブなスキーマの

論理的な削除については、反対と賛成の両方のアドバイスがあることに注意してください。

個人的な経験から、メイン アプリケーションで選択可能な項目(ドロップダウン リスト)に論理的な削除を採用していますが、これまでのところ問題はありません。

アイテムが古くなった場合、その値はどこで使用されても保持される必要がありますが、新しいドキュメントの場合、ドロップダウン リストに表示されなくなります。論理的な削除以外でこのシナリオを処理できるようにするためのより良い解決策にまだ出くわす必要があります。

于 2012-07-01T20:45:48.450 に答える
0

おそらく「deprecated_schema」の追加で、削除するhouse_schema行を非推奨の保持セクションにコピーするだけです。元のhouse_schemaIDフィールドを格納するためのフィールドが必要です。これにより、houseテーブルの正しいエントリに引き続きアクセスできます。

次に、house_schemaテーブルから削除しても、そのスキーマに基づいて家へのアクセスを保持できます。

于 2012-07-01T21:29:44.170 に答える
0

いくつかの可能性があります:

  • スキーマが存在しなくなったことを示すためにフラグを立てる「削除済み」フィールドをhouse_schemaに含めることができます。これは、多くのクエリを変更することを意味します。

  • 「削除できない」デフォルトのスキーマを使用して、1つを削除すると、その家がフォールバックする可能性があります。

于 2012-07-01T20:47:08.573 に答える
0

別の観点を追加するために、おそらく *house_schema* に保存されている詳細は実際にはの属性であり、そのように保存する必要があると考えましたか?
これは、過度の正規化のケースと見なすことができます。

于 2012-07-02T01:52:46.103 に答える
0

簡単な解決策として、「削除済み」フラグを house_schema に追加できます。そうすれば、履歴エントリを保持できます。利用可能な house_schema エントリをユーザーに表示するときに、削除されていないものをフィルターします。

于 2012-07-01T20:53:02.947 に答える