Chapter 04

【アンチパターン】データベース論理設計

たなかなた
たなかなた
2022.12.08に更新

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

  • やりたい事
    • 複数の値を持ちたい
  • アンチパターン
    • 1つのカラムに、カンマ区切りで持ってしまう
  • 解法
    • 交差テーブル(中間テーブル)を使用する
  • 参考文献

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

  • やりたい事
    • 階層構造を表現したい
  • アンチパターン
    • 隣接リストを用いて、常に親にのみ依存する
  • 解法
    • 代替ツリーモデルを用いる(経路列挙モデル、入れ子モデル、閉包モデル、など)
  • 参考文献

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

  • やりたい事
    • 行を一意にすべく、主キーを持ちたい
  • アンチパターン
    • とりあえず"ID"(疑似キー)を用いる
  • 解法
    • 一意でNULL許容せず識別可能な属性があるなら、自然キーや複合キーを用いればよい。そうでなくても適切な名称を付けるべき。
  • 参考文献

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

  • やりたい事
    • 各テーブルのリレーションを設計したい
  • アンチパターン
    • 外部キー(参照整合性)を採用しない
  • 解法
    • ポカヨケを避けるため、外部キー制約を設ける
  • 参考文献

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

  • やりたい事
    • 将来の変更に備えて、可変的な属性をサポートしたい
  • アンチパターン
    • EAVを採用する(Entity/Attribute/Value)
  • 解法
    • サブタイプのモデリングを行う(シングルテーブル継承、具象テーブル継承、クラステーブル継承、など)
  • 参考文献

ポリモーフィック関連

  • やりたい事
    • 複数の親を持ちたい
  • アンチパターン
    • ポリモーフィック関連を定義し、二重な外部キーを持つ(親同士に関連性がない事もしばしば)
  • 解法
    • 参照を逆にし、交差テーブルや共通の親、UNIONでの結合を行う(そもそも親子関係が逆になっている事がこのアンチパターンによくある)
  • 参考文献

マルチカラムアトリビュート(複数列属性)

  • やりたい事
    • 単一属性に対して、複数の値を持ちたい
  • アンチパターン
    • 単一属性を複数列に渡って保持する(tag1,tag2,tag3,...など)
  • 解法
    • 従属テーブルを作成する
  • 参考文献

メタデータトリブル(メタデータ大増殖)

  • やりたい事
    • 日々増加していくレコードをどうにかしたい
  • アンチパターン
    • テーブルや列を増殖させる(fy2020,fy2021,fy2022,...など)
  • 解法
    • 従属テーブルを作成する、パーティショニング(水平・垂直)を用いる
  • 参考文献