データベースでuserテーブルを作った時などIDをつけて、auto incrementにすると思います。
ですが、ユーザの削除などで使われないIDが出てくると思います。つまり1,2,3,4,5とユーザーがいて、3のユーザが削除されると、1,2,4,5となると思います。
この場合、4のユーザを3へ、5のユーザを4へなど変更しないのが普通なのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
たとえは、この teratail で考えてみましょうか。
id : 10001
user: sumsum25
というデータが user テーブルにあるとします。(おそらくあるはずですね)
この質問の投稿を管理しているテーブル(とりあえず post としましょう)も当然あるはずです。
この投稿が、誰によって作られたものかがわかるように、user_id も持つはず。
id: 16297
user_id: 10001
title: データベース設計 IDのインクリメント
content: データベースでuserテーブルを作った時などIDをつけて、auto incrementにすると思います。...
この投稿をしたユーザー(ここではあなた)が退会したと言って、他の人が、10001番になったら、この投稿は誰がしたことになりますか?
おかしなことになってしまいますね。無理に整合性を保つとなれば、投稿だけじゃなくて、フォローのデータとか色々変更しなくてはいけなくなります。
この場合、4のユーザを3へ、5のユーザを4へなど変更しないのが普通なのでしょうか?
だから、変更しないのが普通というより、事実上「絶対してはいけない」ことなのです。
投稿2015/09/15 19:10
編集2015/09/15 19:23退会済みユーザー
総合スコア0
0
データベース関連でやりがちなミスを集めたSQLアンチパターンという本がありますが、その21章に「シュードキー・ニートフリーク(疑似キー潔癖症)」という、ちょうどこの話題を取り上げたものがあります。
IDはデータベース管理用の値なので、詰める必然性もありませんし、それどころかRDBMSによっては、一意性を確保するために、「番号は生成したけど使われない」ということすら起きえます。
なお、どうしても飛びのない連番を振りたい場合は、IDとは別途で用意した方がいいでしょう。
投稿2015/09/16 01:47
総合スコア145183
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
主キーは変更しないのが普通です。
理由は、リレーションに関係なく、変更するメリットがないからです。
例えば、userテーブルのみしか扱わないアプリを想定してください。
別のアプリ参照は無い(どこかでリレーションする可能性がない)とします。
この状態で、ユーザーを削除した時に、
・歯抜けのIDを整列させて、
・インデックスを調整する
という対応(実装)する手間に必要性を感じますでしょうか?
まあ、それが質問なのでしょうが、必要になるケースは無いです。
ちなみに蛇足ですが、
userテーブルをauto incrementしている主キーでリレーションしてると、
あるタイミングでDelete-Insertの総入れ替えをした際にコケます。
DBの知識が高い人からすれば笑わってしまわれる運用かもですが、
現場では、こういう対応が起こります。
投稿2015/09/15 22:18
総合スコア1124
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
投稿2015/09/15 23:54
総合スコア5936
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。