やめた方がいいテーブル設計 〜重複データのカラム持ち〜

カラムによる重複データの保持(列持ち)

社員ID 社員氏名 子供1 子供2 子供3
000001 山田 太郎 山田 小太郎 山田 小次郎 山田 小三郎

上記のように子供を複数持つ場合のデータの保持を、複数のカラムを作成することで対応したものは、列持ちと言われます。
そして、この列持ちは、システムを作る上で不適切な場合があります。

列持ちをやめたほうが良い理由

  • システムの拡張性が悪い

データを列持ちで定義した場合、重複データの数の増加か難しくなります。
上の例では、子供を3人まで登録できるようにしていますが、もし4人目が生まれた場合、上記テーブルでは、4人目の登録を行うことができません。

もし、4人目を登録する必要が出てきた場合は、テーブルに列を追加する対応となります。
そして、テーブルへの列の追加は、コストの大きな改修となることが多いです。

なぜなら、テーブルを変更した場合、テーブルに合わせて、テーブルへの登録更新箇所および、テーブル参照を行なっている箇所のすべてのSQLおよび、 SQLを使用しているすべての機能の見直しが必要になるためです。

  • nullによるデータ保持

データを列持ちで定義した場合、必ず列の数だけデータが作られます。
しかし、登録するデータによっては、あらかじめ用意した列より少ない列で良い場合があります。

もし、あらかじめ用意した列より少ない列で十分な場合、残りの列にはnullが設定されることとなります。

(例)子供を3人まで登録でいるようにしたテーブルに対して、子供1人しかいない場合

社員ID 社員氏名 子供1 子供2 子供3
000001 山田 太郎 山田 小太郎 null null

そのため、列持ちでデータを定義した場合、不要なnullデータが登録されてしまいます。
結果として、システム側で、取得データごとにnullのチェックが必要となります。

カラムではなく行でデータを保持する

データを行で保持することで、データを列持ちする場合に問題となっていたことがクリアされます。

まず、重複データの数が増えた場合についてですが、行でデータを保持している場合は、IDを追加し、新規で行を登録するだけで対応可能です。
そのため、場合によっては、システムの改修が不要となる場合もあります。
また、通常のシステム改修でも入力チェックを変更するだけで済む場合が多いです。

そして、行でデータを保持することで、必要な数だけ行を登録することが可能となります。
そのため、子供を登録するテーブルの場合、子供が2人であれば2行登録、子供が3人であれば3行登録となるため、nullによるデータの登録が不要となります。

なお、行でデータを定義した場合は、以下のようなテーブル構成になります。

社員番号 社員名
000001 山田 太郎
社員番号 社員子供番号 子供氏名
000001 1 山田 小太郎
000001 2 山田 小次郎
000001 3 山田 小三郎

テーブル設計について学びたい方へ

達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ

達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ

グラス片手にデータベース設計 販売管理システム編 第2版 (DB Magazine Selection)

グラス片手にデータベース設計 販売管理システム編 第2版 (DB Magazine Selection)

グラス片手にデータベース設計 ~会計システム編 (DB Magazine Selection)

グラス片手にデータベース設計 ~会計システム編 (DB Magazine Selection)

絵で見てわかるシステム構築のためのOracle設計 (DB Selection)

絵で見てわかるシステム構築のためのOracle設計 (DB Selection)

SQLについて学びたい方へ

達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ (CodeZine BOOKS)

達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ (CodeZine BOOKS)

その他

人月の神話【新装版】

人月の神話【新装版】

ソフトウェア開発はなぜ難しいのか ~「人月の神話」を超えて (技評SE選書)

ソフトウェア開発はなぜ難しいのか ~「人月の神話」を超えて (技評SE選書)