0

私は大規模なデータベースを持っていますが、予想通り、テーブルを参照する多くの外部キーがあります。データベース設計の観点から、外部キーによって参照されるレコードの削除をどのように処理すればよいですか?

私が考えた1つのオプションは、レコードがアクティブかどうかを決定するブール列をテーブルに追加することでした。したがって、レコードを削除する場合は、ブール値のアクティブ値を false に設定します。

データベースが肥大化する可能性がありますが、参照されるすべての外部キーが変更されないだけでなく、データベースにはより多くの情報が保持されます。

システムクリティカルなデータベースに関するこの問題について、あなたの考えを聞きたいです。

4

2 に答える 2

1

私があなたの質問を理解している限り、2 つのテーブルがあります。

| main  |               |     child     |
|-------|               |---------------|
|id|data| (1) ----> (n) |id|main_id (FK)|

また、子テーブルにレコードがある場合、メイン テーブルからデータを削除したくありません。

どの RDBMS を使用しているか、あなたは言いませんでした。しかし、MySQL では外部キー タイプを設定できます。RESTRICT に設定すると、子テーブルにデータがある場合、システムはメイン テーブルからデータを削除することを許可しません。

または、CASCADE に設定すると、メイン テーブルのデータを削除すると、子テーブルからも自動的に削除されます。

そのため、追加の「アクティブ」フィールドを作成する必要はありません。

于 2012-07-13T07:12:54.230 に答える
0

あなたの質問に対する答えは、あなたのアプリケーションに大きく依存します。

「履歴」データが必要な場合は、「有効」フラグを使用するのが正しい選択のようです。ただし、データベースに機密データがあり、削除されたデータを簡単に復元できないようにしたい場合は、「有効」フラグは使用できません。

その他の側面:

  • 「元に戻す」必要がありますか?
  • 削除操作はどのくらいの頻度で発生しますか? 多くの削除により、多くの無効なエントリが作成されます。
  • 無効なエントリを参照するエントリも無効にする簡単な方法 (データベース トリガーなど) はありますか?
  • アプリケーションが有効なエントリのみを表示/処理することを保証するプロセスまたはメカニズムはありますか? ビューを検討してください。
  • 有効なエントリの検索を高速化し、多くのスペースが必要になるように、適切なインデックスを作成することを検討してください。
  • 削除されたエントリを最終的に削除するための要件 (技術的、組織的、法的) はありますか? その目的のために削除日が必要ですか?
  • クリーンアップスクリプトは必要ですか?

たくさんの質問があります。しかし、これらの質問があなたの質問に対する答えを見つけるのに役立つことを願っています。

于 2012-07-13T10:41:39.393 に答える