SQLアンチパターンに登場する各アンチパターンを、出来る限り1行でまとめて俯瞰するための一覧。
記憶をたどるためのキーワードのインデックスとして使うことを目的にしている。
また、週次で別途読み合わせの勉強会を行っているため、以下の一覧は勉強会の都度更新され、併せて勉強会資料へリンクする。
##Jaywalking(信号無視)
1対多または多対多の関係のテーブル間の id 管理において、Varcharなどのカラムを用意して「1,2,3,4,5」などの区切り文字で区切った値を代入すること
##Naive Trees(素朴な木)
親子関係を持つテーブル間の id 管理において、中間テーブルを用意せず、parent_id のような親の ID を意味するカラムを用意して代用すること
##ID Required(とりあえずID)
どのようなテーブルにも id という名前の PRIMARY KEY を用意することだけで一意性を保てると安易に考えること
##キーレスエントリ(外部キー嫌い)
外部キーをまったく使おうとしないこと
##EAV(エンティティ・アトリビュート・バリュー)
汎用的な値を管理するために attribute テーブルを使うこと
##ポリモーフィック関連
1対多関係の複数テーブルのうち、子テーブル側に親テーブルの primary な id を持たせ、拡張性を持たせたいがために、親テーブルの種別(招来増える可能性がある)をテキスト型などで持たせること
CREATE TABLE children (
child_id serial,
parent_id int(10),
parent_type enum('hoge','piyo')
);
CREATE TABLE parent_hoge (
hoge_id serial
);
CREATE TABLE parent_piyo (
piyo_id serial
);
tag1, tag2, tag3 ...
や account1, account2 ...
などの柔軟性の無い可読性の低いスキーマ構造を定義してしまうこと
##メタデータトリブル(メタデータ大増殖)
「2012年の売上げ」の「2012年の」に当たるようなメタな情報をカラム名に持たせてしまうこと(往々にしてそういったデータは増殖し、カALTER TABLE の必要性や SELECT の難化をもたらす)
##ラウンディングエラー(丸め誤差)
正確さが求められる場面で FLOAT 型(概数型)を使うこと
##31 Flavors
変化する可能性があるデータを、CHECK制約やENUM型などで表現し、柔軟性を失うこと
元ネタはバスキン・ロビンス。
サーティワン・アイスクリームのバスキン・ロビンスは、当初「31のフレーバーのアイスクリームをお客に提供する」という意味を込めてサーティワンと名乗っていたが、フレーバーは増加して現在1000種類となり、店舗で提供しているのもたいてい28種類または32種類となっている。
つまり、変化する可能性のあるデータ(フレーバーの種類)を、メタデータ(アイスクリームシリーズの名前)で表現してはいけない、という意味。
##Phantom Files(幻のファイル)
データベース内に BLOB でファイルを保持する方法もあると考えることを忌避し、そもそも検討しないこと
##Index Shotgun(闇雲インデックス)
インデックスを使用する際、クエリの計測や、クエリ・スキーマ・インデックスの最適化、インデックスのメンテナンスなどを怠ること