この回答はISO/IEC / ANSI標準SQLに対するものであり、より優れたフリーウェアのふりをするSQLが含まれています。
最初の問題は、1つではなく、2つのカテゴリを識別したため、合理的に比較できないことです。
A.カテゴリー1
(1)(4)および(5)には複数の可能な値が含まれ、1つのカテゴリーです。WHERE句では、すべてを簡単かつ効果的に使用できます。それらは同じストレージを持っているので、ストレージも読み取りパフォーマンスも問題ではありません。したがって、残りの選択肢は、列の目的のための実際のデータ型に基づいています。
ENUMは非標準です。より良いまたは標準的な方法は、ルックアップテーブルを使用することです。次に、値は非表示ではなくテーブルに表示され、任意のレポートツールで列挙できます。ENUMの読み取りパフォーマンスは、内部処理のために小さな打撃を受けます。
B.カテゴリー2
(2)と(3)は2つの値の要素です:True / False; 男女; 生死。そのカテゴリはカテゴリ1とは異なります。データモデルと各プラットフォームの両方での処理は異なります。BOOLEANはBITの同義語であり、同じものです。法的に(SQLに関して)、すべてのSQL準拠プラットフォームで同じように処理され、WHERE句で問題なく使用できます。
パフォーマンスの違いはプラットフォームによって異なります。SybaseとDB2は、最大8ビットを1バイトにパックし(ここではストレージは重要ではありません)、2の累乗をオンザフライでマップするため、パフォーマンスは非常に優れています。Oracleはバージョンごとに異なることを行い、モデラーがパフォーマンスの問題を克服するためにBITの代わりにCHAR(1)を使用するのを見てきました。MSは2005年までは問題ありませんでしたが、結果が予測できないため、2008年にはそれを破りました。したがって、簡単な答えは、CHAR(1)として実装することです。
もちろん、8つの別々の列を1つのTINYINTにパックするなどのばかげたことをしないことを前提としています。これは深刻な正規化エラーであるだけでなく、コーダーにとっては悪夢です。各列を離散し、正しいデータ型に保ちます。
C.複数のインジケーターとNULL可能列
これは、(A)および(B)とは関係がなく、独立しています。列が正しいデータ型とは、所有している数とNullableかどうかによって異なります。Nullableは、(通常)列がオプションであることを意味します。基本的に、モデリングまたは正規化の演習は完了していません。機能従属性はあいまいです。正規化の演習を完了すると、Null許容列やオプションの列はなくなります。それらは特定の関係に対して明らかに存在するか、または存在しません。これは、スーパータイプ-サブタイプの通常のリレーショナル構造を使用することを意味します。
確かに、それはより多くのテーブルを意味しますが、Nullはありません。Enterpise DBMSは、テーブルや結合が増えても問題はありません。これが最適化されているためです。正規化されたデータベースは、正規化されていないデータベースや非正規化されたデータベースよりもはるかに優れたパフォーマンスを発揮し、「リファクタリング」なしで拡張できます。サブタイプごとにビューを提供することで、使いやすくなります。
このテーマに関する詳細情報が必要な場合は、この質問/回答をご覧ください。モデリングについてサポートが必要な場合は、新しい質問をしてください。あなたの質問のレベルでは、5NFに固執することをお勧めします。
D.ヌルのパフォーマンス
これとは別に、パフォーマンスが重要な場合は、Nullを除外します。各Nullable列は可変長として格納されます。行/列ごとに追加の処理が必要です。エンタープライズデータベースは、このような行に対して「遅延」処理を使用して、ログなどが固定行を妨げることなくキューを移動できるようにします。特に、インデックスで可変長列(Nullable列を含む)を使用しないでください。アクセスごとに解凍する必要があります。
E.投票
最後に、私はこの質問のポイントが世論調査であるとは思いません。技術的な回答や意見さえも得られるのは十分公平ですが、投票は人気コンテスト用であり、SOの回答者の技術的能力は非常に広範囲にわたるため、最も人気のある回答と最も技術的に正しい回答は2つの異なるものになりますスペクトルの終わり。