テーブルの 1 つに 52 列が含まれるようにデータベースを設計しました。すべての属性は主キー属性と密接に関連付けられているため、それ以上の正規化の範囲はありません。
同じ種類の状況が発生し、単一のテーブルに非常に多くの列を保持したくない場合は、それを行うための他のオプションを教えてください。
テーブルの 1 つに 52 列が含まれるようにデータベースを設計しました。すべての属性は主キー属性と密接に関連付けられているため、それ以上の正規化の範囲はありません。
同じ種類の状況が発生し、単一のテーブルに非常に多くの列を保持したくない場合は、それを行うための他のオプションを教えてください。
列が 50 列あることは決して奇妙ではありません。ERP システムでは、一部のテーブルに 100 以上の列があることがよくあります。
調べることができることの 1 つは、ほとんどの列が有効なデフォルト値 (null、today など) を取得していることを確認することです。これにより、挿入が簡素化されます。
また、コードが常に列を指定していることを確認してください (つまり、"select *" を指定しないでください)。将来のあらゆる種類の最適化には、列のサブセットを持つインデックスが含まれます。
以前使用したアプローチの 1 つは、テーブルを 2 つのテーブルに分割することです。これらのテーブルは両方とも、元のテーブルの主キーを取得します。最初のテーブルには最も頻繁に使用される列を配置し、2 番目のテーブルには使用頻度の低い列を配置します。通常、最初のものは小さくする必要があります。さまざまなインデックスを使用して、最初のテーブルの処理を高速化できるようになりました。私たちの設計では、メモリ エンジン (RAM) で実行される最初のテーブルもありました。これは、クエリを読み取るだけだったからです。table1 と table2 から列の組み合わせを取得する必要がある場合は、両方のテーブルを主キーで結合する必要があります。
52 列のテーブルが必ずしも間違っているわけではありません。他の人が指摘しているように、多くのデータベースにはそのような獣がいます。しかし、私は ERP システムを優れたデータ設計の模範とは考えていません。私の経験では、ERP システムはむしろ逆になる傾向があります。
とにかく進め!
あなたはこう言います:
「すべての属性は主キー属性と密接に関連付けられています」
これは、テーブルが第 3 正規形 (またはおそらく BCNF) であることを意味します。その場合、それ以上の正規化が不可能であるというのは真実ではありません。おそらく、第 5 正規形に進むことができますか?
第 5 正規形は、結合の依存関係の削除に関するものです。すべての列は主キーに依存していますが、列間に依存関係がある場合もあります。たとえば、COL23 の各値に関連付けられた COL42 の複数の値があります。結合の依存関係とは、COL23 の新しい値を追加すると、COL42 の値ごとに 1 つずつ、複数のレコードを挿入することになることを意味します。5NF に関するウィキペディアの記事には、適切な実例があります。
5NFまで行く人はあまりいないと思います。また、52 列のテーブルでも、既に 5NF になっている可能性があります。しかし、それはチェックする価値があります。1 つまたは 2 つの補助テーブルを分割できれば、データ モデルが改善され、メイン テーブルの操作が容易になるからです。
もう 1 つのオプションは、「複数列テーブル」MCT 設計よりも「項目と結果のペア」(IRP) 設計です。特に、列を時々追加する場合はそうです。
MCT_TABLE
---------
KEY_col(s)
Col1
Col2
Col3
...
IRP_TABLE
---------
KEY_col(s)
ITEM
VALUE
select * from IRP_TABLE;
KEY_COL ITEM VALUE
------- ---- -----
1 NAME Joe
1 AGE 44
1 WGT 202
...
IRP は少し使いにくいですが、はるかに柔軟です。
IRP 設計を使用して非常に大規模なシステムを構築しましたが、大量のデータに対しても適切に機能します。実際、数列しか必要ない (つまり I/O が増える) だけで幅の広い行全体ではなく、必要な行だけを取得する (つまり I/O が減る) ため、列編成された DB のように動作します。