参考書を読んだメモ : 達人に学ぶDB設計 徹底指南書 7章, 8章

達人に学ぶDB設計 徹底指南書

論理設計のバッドノウハウ

非スカラ値

  • 不可分ではない値
  • 第一正規形ではない形

ダブルミーニング

  • テーブルの列は変数ではない。一度意味を決めたら変更不可

単一参照テーブル

  • あらゆるタイプのマスタを一つのテーブルで表したもの
  • テーブルにポリモルフィズムはいらない

テーブル分割

  • 水平分割
    • レコード単位でテーブルを分割する
    • 年毎に分割など
  • 垂直分割
    • 列を軸に分割する
    • 必要なカラムを集めたテーブルに分割する
  • これらは拡張性に乏しいことで原則使うべきではない

シャーディングとカラムベース

  • 新しいデータベースのアーキテクチャとして期待されている
  • 発想は水平分割と垂直分割
  • シャーディング
    • 水平分割
    • レコードを物理的に分離して格納することでI/O分散を図る手段
    • 論理的にも物理的にも異なるテーブルとして扱われる
  • カラムデータベース
    • 対になるのがローデータベース
    • 通常はローデータベースで行毎にブロックとして格納しているがカラムデータベースは列毎にブロック分けされている
    • 利用する列が限られている場合、I/Oを削減できる

不適切なキー

  • 可変長文字列
    • キーは不変性を備えてなくてはならない
    • 固定長文字列と混合する(空白などが不便

ダブルマスタ

  • 同じような情報を持つマスタを二つ作ること
  • システム統合などで起きるので気をつける必要がある

論理設計のグレーノウハウ

代理キー主キーが役に立たない時

  • そもそも一意キーが存在しない
  • 一意キーはあるが、サイクリックに使いまわされる
    • 主キーの値が全て使われてしまった場合に既存の値が使われる場合に起こる
  • 一意キーはあるが、途中で指す対象が変化する
  • 代理キーはこれらの問題を解決するために用意された人工的なキー
  • 自然キーで解決する場合はタイムスタンプ、インターバル(有効期間)という方法がある

列持ちテーブル

  • 配列は作れないのでカラムを作る(ex. 子1, 子2, 子3,...カラム)
    • 拡張性に乏しい
    • 無用のNULL
  • 行持ちテーブルを使うと良い(行でデータを持つ

アドホックな集計キー

  • 場当たり的なキー

多段ビュー

  • 複雑で管理が大変になる

データクレンジングの重要性

  • データをデータベースに登録できる状態にすること

データクレンジングの内容

  • 一意キーの特定
    • 不適切なキーを防ぐ
  • 似たような名前を集めて統合する
    • ダブルマスタを防ぐ