LoginSignup
70
68

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-09-04

スクリーンショット 2014-09-04 17.01.36.png

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

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

70
68
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
70
68