兎小屋の手記

PerlやPHPの話題などをひっそりと書きます。

SQLアンチパターン読書記録1

唐突にSQLアンチパターンを読み始めたので読書記録を。 2年くらい前に買って斜め読みしたまま書棚に眠っていたので引っ張り出して少しずつ読んでいます。

少しずつ読んでいるので各章のメモ書き。

1章:ジェイウォーク(信号無視)

1カラムに複数の値をカンマなどで結合してINSERTしてしまうパターン。 単に正規化できていないパターン

2章:ナイーブツリー(素朴な木)

階層構造を表現するパターン。 解決策に示されている方法は経路列挙、入れ子集合、閉包テーブル。 木構造や階層構造をDBでどう扱うかというテーマで本が出ているくらいなので実際に手を動かして試してみたい。(今回はやってない。)

3章:IDリクワイアド(とりあえずID)

ナチュラルキーがあってもなくてもとりあえずサロゲートキーにしてしまうパターン。 アンチパターンを用いてもよい場合としてORMフレームワークを使っている場合が挙げられていますが、 あくまでツールの都合なので、実質的な自然キーがありながらもIDを作るなら、せめてUNIQUE制約をつけないと悲劇が起きるかも。 本来、一意なhogehogeデータがなぜか2レコードできちゃった!みたいな。

4章:キーレスエントリ(外部キー嫌い)

タイトル通り、外部キー制約を使用しない。 poka-yoke(ポカヨケ)という言葉が紹介されていますが、まさにこれに尽きる。

5章:EAV(エンティティ・アトリビュート・バリュー)

キー:バリューで保持できるように可変のテキスト型で表現してしまうパターン 解決策はサブタイプを定義し、そのタイプによって参照・非参照のカラムを分け、非参照のカラムにはNULLを入れる、シングルテーブル参照と 共通するカラム以外はサブテーブルを作る具象テーブル継承 以前、DB設計したときにどちらが正解か悩んで複数のサブテーブルを切った(具象テーブル継承を採用した)ことがあったが、 シングルテーブル継承はサブタイプの種類やサブタイプ固有の属性が少ない場合に向いているそうだ。

また進んだら更新しようと思います。