2

リレーショナルデータベースの行を削除または無効にする必要がありますか?

履歴テーブル内のテーブルへの変更をウェアハウジングする戦略を採用することを考えると、MySQLで特定の行のステータスを実装するための次のオプションに直面します。

  • isActiveブーラン_
  • 列挙activeStatus
  • activeStatus小さなActiveStatusルックアップテーブルを参照するINT
  • 別のactiveStatusテーブルを参照していないINT

最初のアプローチは、他のタイプのアクティブなステータスをサポートするために将来さらにブール値が必要になる可能性があるため、私の意見ではかなり柔軟性がありません(それらが何になるかはわかりませんが、「段階的に廃止される」または「ユーザーのランダムなグループ」など)。

MySQL列挙型が悪いと言われているので、2番目のアプローチはおそらく飛ばないでしょう。

私は3番目のアプローチが好きですが、それが比較的小さな問題に対する手間のかかる解決策であるかどうか疑問に思っています。

4番目のアプローチでは、各ステータスIN​​Tが何を意味するのかを事前に知っておく必要があり、物事を行うための時代遅れの方法のように見えます。

正規の正解はありますか?私は別のアプローチを無視していますか?

4

2 に答える 2

2

個人的には、3番目のオプションを使用します。

あなたが示唆したように、ブール値は実際にはより複雑になることがよくあります。ENUM は便利な場合もありますが、各値に関する追加情報 (誰がいつ追加したか、特定の期間またはソース システムに対してのみ有効か、コメントなど) をすぐに保存したいという欠点があります。 、ルックアップ テーブルを使用すると、これらのデータを追加の列で簡単に管理できます。ENUM は、データを特定の値 (CHECK制約など) に制限するための優れたツールですが、それらの値が重要な意味を持ち、ユーザーに公開する必要がある場合は、それほど優れたツールではありません。

履歴テーブルをファクト テーブルのように扱い、レポートで使用する予定があるかどうかは、質問から完全には明らかではありませんが、そうであれば、ActiveStatusルックアップ テーブルをディメンションと見なすことができます。この場合、ユーザーがクエリ条件を選択できるようにするためにレポート ツールがディメンション テーブルから可能な値を読み取ることができるため、テーブルの方がはるかに簡単です。そのようなツールは通常、ENUM について何も知りません。

于 2013-01-23T14:39:40.673 に答える
1

私の観点からは、uのステータスが2つを超える場合は、2番目のアプローチの方が適してENUMいます。静的セットに含まれることがわかっているデータに最適だからです。ただし、アクティブと非アクティブのステータスが2つしかない場合は、ブール値を使用することをお勧めします。

編集:将来、あなたの値を変更しないことが確実な場合はENUM、そのようなフィールドにENUMを使用するのは素晴らしいことです。

于 2013-01-23T07:16:52.847 に答える