論理削除という設計の是非はここではおいておいて、交差テーブルにa_id
, b_id
という複合主キーに加えて削除日時というカラムを持たせる場合があります。
(論理削除というよりは、設定日時というカラムも持つことでいつからいつまでの時期にこの関係が存在していたという事実の表明をしているのだと言えます)
さてこの日時カラムを考慮してJOINを行う際、日時条件の判定式はJOINのON句に書きますか? それともWHERE句に書きますか?
意味的にはどちらでも同じですし、ほとんどのDBでは実行プランの差も出ないと思いますので、純粋に読みやすさやポリシーの問題であると思っています。
●WHERE句に書くべき根拠
- ON句に書くのはキーの関係である。日時条件はキーの関係ではない
- USINGだけで書ける条件をわざわざ日時条件のためにONに展開するのは馬鹿馬鹿しい
●ON句に書くべき根拠
- 日時条件はキーの関係の存在に関わることであり、ON句の責任範囲だ
- 結合ルールの存在が一行でわかることは読み手にスキーマ理解のヒントを与える良い書き方
自分で思いつくメリットデメリットは以上のような感じですが、ほかに考慮点があったら教えてください。
具体例の追記
usersテーブル
user_id | nickname | face_image |
---|---|---|
1 | Alice | (BLOB) |
2 | Bob | (BLOB) |
3 | Charley | (BLOB) |
followingテーブル
follower_user_id | followee_user_id | created_at | deleted_at |
---|---|---|---|
1 | 2 | 2015-01-01 | 9999-12-31 |
2 | 3 | 2015-01-01 | 2016-12-31 |
このとき、あるユーザーのフォロワー一覧を表示しようとしたら
A. フォロー関係の生存期間をONで判定
sql
1SELECT u.user_id, u.nickname, u.face_image 2FROM following f 3 JOIN users u 4 ON (f.follower_user_id = u.user_id AND current_time < f.deleted_at) 5WHERE f.followee_user_id = ?
B. フォロー関係の生存期間をWHEREで判定
sql
1SELECT u.user_id, u.nickname, u.face_image 2FROM following f 3 JOIN users u 4 ON (f.follower_user_id = u.user_id) 5WHERE f.followee_user_id = ? AND current_time < f.deleted_at
どちらの記法を選びますか、その根拠はどういったものが考えられますか、という質問になります。
回答4件
あなたの回答
tips
プレビュー