Edited at

SQLアンチパターン斜め読み

More than 3 years have passed since last update.



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(闇雲インデックス)

インデックスを使用する際、クエリの計測や、クエリ・スキーマ・インデックスの最適化、インデックスのメンテナンスなどを怠ること