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コードとかかなーと思ったんですが、再利用される可能性あるし、見極め難しそう。サロゲートキー使うでも良さそうだし、ケースバイケースだろうなと。