SQLアンチパターンを読み始めたので、1つ1つ書いてのメモです
目的
- 目的:複数の値を持つ属性を格納する
- ジェイウォーク(信号無視)と同じ。ジェイウォークでは、カンマ区切りで1つのカラムにデータを入れていた
アンチパターン
複数の列を定義する
- tag1、tag2とか、image1、image2とか
- やったことある
課題
- 値の検索が複雑になる
- tag1、tag2 を検索しなくてはいけない
- 値の追加と削除が複雑になる
- null のカラムを探してから update をすることになる
- 一意性の保証ができない
- tag1、tag2 に同じ値を入れちゃう
- 増加する値に対応が大変
- tag3 を増やすときには大きなテーブルになってて、ロックが必要になったり、取得用のSQLを書き換えたりする必要がある
用いてもいいパターン
- 属性の選択肢を限定できる場合
- tag1 には、報告者、tag2には、担当者、tag3 には、品質管理者
- 論理的に異なる場合
解決策
- 属性を格納する列を 1 つ持つ従属 テーブルを作成
- ジェイウォークのときと発想は同じ
まとめ
同じ意味を持つ値は、1 つの列に格納するようにしましょう。
感想
- やってた!
- きちんとテーブルを分けます。