blog.toxn

あしあと

SQLアンチパターンその3 IDリクワイアド(とりあえずID)

IDリクワイアド(とりあえずID)とは

名前のまま、「とりあえずID列作っておこうぜ」ということ

いつ起こるのか

主キーを作るルールがあるとき

何をしてはいけないのか(アンチパターン

どんなテーブルに対しても「ID」という名前の列(サロゲートキー)を作ること

例:店で販売する商品

CREATE TABLE Goods(
  id            SERIAL  PRIMARY KEY,
  product_id    BIGINT,
  name          NVARCHAR(20),
);


(id, product_id, name)
----------------------------------
(1, 1014, "レッドブル エナジードリンク 缶185ml")
(2, 1237, "ライジン 缶185ml")
(3, 1935, "モンスターカオス 缶355ml")
(4, 2084, "リゲイン エナジードリンク 缶190ml")
(5, 2365, "バーン エナジードリンク 缶250ml")
...

何故ダメなのか

冗長な列ができてしまう

まさに上の例とかそうだけど、他の列を自然キーとして扱えるのならば、あえてid列を追加する必要は無い。

いい解決策は

「id」以外の名前をつける

「商品コード」とか、「user_id」みたいなわかりやすい名前を付けることを心がけること。交差テーブル作った時に、交差する両方のテーブルの主キーが「id」だと交差テーブルが扱いにくくなる。

自然キーで使えそうなものって、JANコードとかかなーと思ったんですが、再利用される可能性あるし、見極め難しそう。サロゲートキー使うでも良さそうだし、ケースバイケースだろうなと。