SQLアンチパターンⅠ部のまとめメモです。
自分用にざっくりアンチパターンと解決策だけまとめるので、気になった方はぜひ書籍を読んでみてください。
アンチパターン:カンマ区切りのフォーマットのリストを格納する
1対多の関係を表すとき、親テーブルの1つのカラムにカンマ(,
)区切りで値を格納してはいけない。
おとなしく交差テーブル(いわゆる中間テーブル)を作成しよう。
アンチパターン:常に親のみに依存する
掲示板のコメント欄のように再帰的な関連を持つデータを、隣接リストモデルを用いて表現してはいけない。
以下の代替ツリーモデルを使用すること。
- 経路列挙モデル
- 入れ子集合モデル
- 閉包テーブルモデル
アンチパターン:すべてのテーブルに「id」を用いる
全てのテーブルにid列を加えると、意図に反した影響が生じることがある。
状況に応じて自然キーや複合キーを活用すること。
アンチパターン:外部キー制約を使用しない
外部キー制約を省略する場合、参照整合性を保証するための「完璧なコード」を書く責任が生じる。
外部キー制約による参照整合性の強制によって、人為的ミスを防止・是正できる。
パフォーマンスは外部キーの省略を正当化する理由としてよく挙げられるが、実際には外部キーの省略によって様々な問題が生じることが多く、その問題にはパフォーマンスの問題も含まれる。
アンチパターン:汎用的な属性テーブルを使用する
なんでも入るテーブルを実装してはいけない。
リレーショナルデータベースの多くの長所が失われてしまうため、そのようなテーブルを実装したいと考えたとき、以下のサブタイプのモデリングを行うこと。
- シングルテーブル継承
- 具象テーブル継承
- クラステーブル継承
- 半構造化データ
アンチパターン:二重目的の外部キーを使用する
複数の親テーブルを参照する一つの外部キーを実装してはいけない。
本来あるべき関連が逆さまになっていることが問題の本質であり、以下のテクニックを用いてリレーションシップを単純化すること。
- 交差テーブルの作成
- 共通の親テーブルの作成
アンチパターン:同じ属性の複数の列を定義する
1対多の関係をあらわすとき、親テーブルにそれぞれの子要素の値を格納する列を複数作成してはいけない。
属性を格納する列を1つ持つ従属テーブルを作成すること。
アンチパターン:テーブルや列をコピーする
行数の多いテーブルを複数のテーブルに分割したり、列を複数列に分割してはいけない。
以下のテクニックを用いてテーブルのパーティショニングと正規化を行うこと。
- 水平パーティショニング
- 垂直パーティショニング
- 従属テーブルの導入