2009-06-18 9 views
0

ここは私の状況です。削除された表の行を処理するためのベストプラクティス?

  • 製品
  • 製品の属性
  • 受注生産品(参照PRODUCT_IDとORDER_ID)、
  • 注文商品の属性(参照:私は、次のテーブルを持っていますorder_productとproduct_attribute)を指定します。

管理者が製品属性(「color」など)を編集する場合、誤って属性を削除して後で追加することがあります。その商品の注文がすでに行われている場合、その商品を削除して再追加すると、商品属性テーブルのIDが変更されます。これにより、Order Product Attributeが存在しない属性IDを参照するようになります(ただし、属性はまだ存在します)。

この問題を解決する最善の方法は何ですか?たぶん私はこの問題について別の視点が必要なのかもしれません。

注:製品を編集するときに、すべての属性がフラッシュされ、現在選択されているもの(同一である可能性があります)が再追加された場合にも問題が発生する可能性があります。

答えて

3

「間違って削除する」を許可しないでください。商品属性表の列として「アクティブ」または「非アクティブ」フラグを設定するだけです。

アトリビュートidの代わりにアトリビュートをいつでも保存することができます。属性IDが継続的に変更されるような設計であれば、注文には歴史的な妥当性はありません。変更が行われたときに製品の新しいバージョンを作成し、古いバージョンを無効に設定するか、履歴レコードを持つように製品の状態を保存します。

0

使用属性の削除を防ぐために、トリガーをテーブルに追加しますか?

OR

はそのテーブルに削除フラグを追加して、実際の行を削除するのではなくフラグを設定します。選択のために属性テーブルにアクセスするクエリのwhere句にIsDeleted = Falseを追加します。

+0

私はそれも考慮しましたが、下部の注記を参照してください。あなたはその場合何をしますか?それはかなり一般的な習慣であるようなものを洗い流すように思える。 –

3

テーブルタイプとしてinnodbを使用し、従属テーブルに適切な外部キー関係を追加します。そうすると、誤って依存する行を削除することはできなくなります。

もちろん、(場合によっては)これを許可したい場合は、foreign_key_チェックをオフに設定することができます。

+0

+1強く同意します。実際には、すべての外部キーチェックを常に有効にしておきます。定義されていない属性を参照する製品は必要ありません。その製品属性を削除する必要がある場合は、既存のすべての製品から削除する必要があります。 –

関連する問題