「相互に排他的」なさまざまな状態がある場合は常に、その列に複数の可能な値を持つ単一の列があることを意味します。ほとんどの場合、これらの値は制限する必要があります。これを行うための最良かつ最も一般的な方法の1つは、「ディクショナリ」または「ルックアップ」テーブルへの外部キーを使用することです。したがって、最も基本的には、次のようなものがあります。
- テーブルの順序(OrderID、OrderStatusID、...)
- テーブルOrderStatus(OrderStatusID、Name)
OrderStatusの値は次のようになります:* 1、 "Paid" * 2、 "Unpaid" * 3、 "Shipped" * 4、 "Unshipped"
重要な部分は、どのステータスが他のステータスと実際に相互に排他的であるかを判断することです。たとえば、上記の例の行は、「有料」と「出荷済み」の両方の順序になる可能性があるため、おそらくあまり良くありません。その場合は、OrderStatusをPaymentStatusとShippingStatusに分割することができます(あなたがほのめかしたように)。
これらの行を分割するかどうかの決定は、実際にはあなたとあなたの特定のニーズ次第です。ただし、何を決定する場合でも、ある時点で変更する必要があると想定してください。通常、変更されないアプリケーション/データベースは、使用されないために放棄された障害のあるアプリケーション/データベースのみです。「最初に正しく理解する」ことは立派な目標であり、事前に調査を行うことは保証されていますが、ほぼ確実にそれを達成することはできません。代わりに、アプリケーション全体を壊すことなくその一部を作り直すことができるように、デザイン/コードの残りの部分を柔軟で変更可能にすることに努力を費やしてください。