- 締切済み
カラム名でseqとidではどちらがふさわしいのでしょうか?
mysql5.1.33を使用しています。 例えば、ユーザ情報を格納するuserテーブルがあって ユーザが決める半角英数字からなるIDを格納するuser_idカラムがあるとします。 そしてAuto Incrementなカラムも付け足すと、 [user] seq INT(11) NOT NULL AUTO_INCREMENT, user_id varchar(16) PRIMARY KEY (seq) UNIQUE KEY user_id (user_id) この場合はseqカラムが主キーになるわけですが、 一般的にはカラム名はseqではなくてidですよね? なんで自分はseqにしたかというと、 user_idカラムのidには文字(半角英字)のIDを、 seqは連番を意味づけさせたいと思いました。 つまり seqがつくカラム名は連番で idがつくカラム名は文字列 と直感的に分かりやすくなるだろうと思ったからなのですが、 みなさんはこのケース(そもそもこのカラム構成が正しいかは分かりませんが・・)の場合は、 どのようなカラム名を付けますか?
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- chukenkenkou
- ベストアンサー率43% (833/1926)
RDBMSによっては、表や列の定義情報として、コメントを付けられるものがあります。 そういったRDBMSに接続できるDBクライアントでは、表名や列名でなく、コメントを表示できるといったものもあります。 SQLで扱うことになる表名や列名は英数字と一部の記号、表示等は日本語でのコメントを使うといったことも行われる場合があります。
- chukenkenkou
- ベストアンサー率43% (833/1926)
趣味でやっているなら自分自身で、仕事でやっているならユーザなりシステム開発の責任者と、取り決めすればいいだけの話です。 IDはそもそも識別子の意味ですから、それが「数字だけ」とか「英数字」だとか、「英数字と一部の記号」などシステムにより様々です。 MySQLのauto_increment や 商用RDBMSでのシーケンス等は、あくまでも「一意なキー値を生成する」ための仕組みです。削除されたり、大きな値が格納されれば連続でなくなるし、空いている番号を明示指定して格納すれば、格納した日時順でもなくなります。 また、採番後にロールバックが発生した場合も、積極的にロールバックしないRDBMSが主流ではないかと思います。 今回のケースでは、ユニークなキーがあるのに、auto_increment列を作る理由は何なのでしょうか? コード体系の変更が頻繁に予想され、かつ十分なメンテ時間を確保できないシステムでは、サロゲートキーを使うこともあるでしょう。 一方で、1個のテーブルで何個もユニークなキーを持つと、insertやupdate時に重複チェックのオーバーヘッドが発生します。
- wipe
- ベストアンサー率52% (37/71)
失礼致します。 ご自分一人で完結するシステムであればどちらでも問題ありませんが、 作業分担や移管、他社への販売があるようであれば、idが無難かと思います。 seqはデータベース名より、プログラム内の変数名に使われるイメージがあります。 また、idは文字列に意味付けず、INT型等に意味づけるべきかと思われます。 ユーザが決める半角英数のIDは、user_name、acount_name等とし、 必要であればシステムの発行するID(オートナンバー)、user_id、acount_idを付加してはどうでしょうか? ご質問にはユーザーの氏名カラム(山田一郎等)がございませんでしたが、 氏名とユーザIDが区別出来るようカラム名に注意して下さい。 以上参考になれば幸いです。
お礼
ご回答ありがとうございます。 なるほど、参考になりました。 ただ2つほど質問があるのですが、 >ご質問にはユーザーの氏名カラム(山田一郎等)がございませんでしたが、 >idは文字列に意味付けず、INT型等に意味づけるべきかと思われます。 その定義の場合だと、 連番を設置しない場合、 user_name ユーザID(ユーザが決定する半角英数) last_name 苗字 first_name 名前 という形式(氏名カラム名が浮かばなかったので一応分けました)になると思うのですが、 user_nameのところはuser_idでは駄目なのでしょうか?(駄目というかwipeさんの定義だとふさわしくないのでしょうか?) それともう一つ 連番ありだと、 user_id 連番 user_name ユーザID last_name 苗字 first_name 名前 になるのかなぁ・・・ 「ユーザが決める半角英数のID」って例えばフォームのタグなどには 普通「ユーザID」って表示しますよね? ユーザIDまたはID?:ここにユーザIDを書き込むtextフォーム パスワード:ここにパスワードを書き込むpasswordフォーム カラム名は「user_name」なのに、表記する場合は「ユーザID」 になるのが自分の中で少し腑に落ちないのでこの質問をさせて頂いたというのもありますが、 ほんとそういう周りから見ればくだらないことから迷いが生じました・・・
- yambejp
- ベストアンサー率51% (3827/7415)
場合によってユーザーIDでさえ変更されるケースが存在するということです。 社員番号や氏名などなんらかの意味があるものをIDとした場合、 未来永劫変更がないということはありえません。 そういう想定のもとに、意味のない連番というユニークを保証する 仕組みで管理することには十分な意味があります。 ただし、煩雑になるため私だったらやりません。
お礼
ご回答ありがとうございます。 規模によるとは思いますが、 将来的なことも考える(それが当たり前なんだと思いますが)と 結構いろいろ考えて設計していかないと駄目そうですね。
- inu2
- ベストアンサー率33% (1229/3720)
命名規則をきっちり決めて、統一させて、ドキュメント化して、 だれがいつ見ても意味が分かるカラム名であれば何でもいいでしょう。 はっきり言って、設計ポリシーの問題です。 人工キーか自然キーか って問題もポリシーの問題ですから、貴方の考えを自由に反映させてください。
お礼
ご回答ありがとうございます。 なるほど、最終決定は自分でしなければいけないのは当然だと思いますが、 あえて聞きたいのですが、 inu2さんならこのケース(連番を主キーにして、ユーザが決める文字列(ID)はUNIQUEにして同じテーブル内に配置するケース)なら 連番を~seqにしますか?それとも~idあるいは別のカラム名にしますか?
お礼
ご回答ありがとうございます。 >今回のケースでは、ユニークなキーがあるのに、auto_increment列を作る理由は何なのでしょうか? 今回の場合はカラム名の決定について様々なパターンを想定するというのも若干あり、 一応こういう構成にしたのですが、たしかにそう言われれば理由はないですね・・・ ただデータベースのことについてあまり知らない自分としては、 「ユーザID → user_name」というのに少し違和感があり(ユニークではない氏名とかも~nameとかになるので)、 それはみなさんはどう思ってる(「別に普通じゃん」でもなんでもいいですが)のかなぁと知りたいと思いました。