第一正規化の例外

前回で第一正規化を実施する際に、一レコード一要素(スカラ値)とすることを第一正規化とすると記述しましたが、例外として第一正規化を行わずにテーブル化する例もあります。
 

配列状態の列

以下のサンプル1のテーブルの列【要素】のように配列化することが可能です。
 

サンプル1
ユーザID ユーザ名 要素
user_a A 要素1,要素2,要素3
user_b B 要素1,要素2
 
 
テーブル作成例
 

-- テーブル作成例

CREATE TABLE sample1 (
    user_id varchar(20),     -- ユーザID
    user_name varchar(20),     -- ユーザ名
    elements    varchar(100)[],  -- 要素(複数)
    PRIMARY KEY(user_id)
);

 

-- レコードの投入例
INSERT INTO sample1 (user_id, user_name, elements)
    VALUES ('id_a', 'A', '{要素1,要素2,要素3}');

 

 

列を配列状態にするメリット・デメリット

以下、メリット・デメリットについて詳解を加えます。
 

メリット

  • 登録するレコード数を抑えられるので、DB操作に関する性能が向上する点
 

デメリット

  • 他テーブルと結合する際に配列型の列をキーに結合することができない点
  • 配列型の列にした場合、その列を検索条件の対象として利用できない点(セル値に対して特定の値がマッチングするレコード取得等)
  • 配列型の列の値の構造が複雑化した場合、仕様を厳密化しないとアプリケーションのエンハンスがしにくくなる点
 
見た通り、デメリットの方が多い為、原則として第一正規化に倣うことをお勧めします。
但し性能を重視した場合、その限りでない事も留意して下さい。