
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がつくカラム名は文字列
と直感的に分かりやすくなるだろうと思ったからなのですが、
みなさんはこのケース(そもそもこのカラム構成が正しいかは分かりませんが・・)の場合は、
どのようなカラム名を付けますか?
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
RDBMSによっては、表や列の定義情報として、コメントを付けられるものがあります。
そういったRDBMSに接続できるDBクライアントでは、表名や列名でなく、コメントを表示できるといったものもあります。
SQLで扱うことになる表名や列名は英数字と一部の記号、表示等は日本語でのコメントを使うといったことも行われる場合があります。
No.4
- 回答日時:
趣味でやっているなら自分自身で、仕事でやっているならユーザなりシステム開発の責任者と、取り決めすればいいだけの話です。
IDはそもそも識別子の意味ですから、それが「数字だけ」とか「英数字」だとか、「英数字と一部の記号」などシステムにより様々です。
MySQLのauto_increment や 商用RDBMSでのシーケンス等は、あくまでも「一意なキー値を生成する」ための仕組みです。削除されたり、大きな値が格納されれば連続でなくなるし、空いている番号を明示指定して格納すれば、格納した日時順でもなくなります。
また、採番後にロールバックが発生した場合も、積極的にロールバックしないRDBMSが主流ではないかと思います。
今回のケースでは、ユニークなキーがあるのに、auto_increment列を作る理由は何なのでしょうか?
コード体系の変更が頻繁に予想され、かつ十分なメンテ時間を確保できないシステムでは、サロゲートキーを使うこともあるでしょう。
一方で、1個のテーブルで何個もユニークなキーを持つと、insertやupdate時に重複チェックのオーバーヘッドが発生します。
ご回答ありがとうございます。
>今回のケースでは、ユニークなキーがあるのに、auto_increment列を作る理由は何なのでしょうか?
今回の場合はカラム名の決定について様々なパターンを想定するというのも若干あり、
一応こういう構成にしたのですが、たしかにそう言われれば理由はないですね・・・
ただデータベースのことについてあまり知らない自分としては、
「ユーザID → user_name」というのに少し違和感があり(ユニークではない氏名とかも~nameとかになるので)、
それはみなさんはどう思ってる(「別に普通じゃん」でもなんでもいいですが)のかなぁと知りたいと思いました。
No.3
- 回答日時:
失礼致します。
ご自分一人で完結するシステムであればどちらでも問題ありませんが、
作業分担や移管、他社への販売があるようであれば、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」
になるのが自分の中で少し腑に落ちないのでこの質問をさせて頂いたというのもありますが、
ほんとそういう周りから見ればくだらないことから迷いが生じました・・・
No.2
- 回答日時:
場合によってユーザーIDでさえ変更されるケースが存在するということです。
社員番号や氏名などなんらかの意味があるものをIDとした場合、
未来永劫変更がないということはありえません。
そういう想定のもとに、意味のない連番というユニークを保証する
仕組みで管理することには十分な意味があります。
ただし、煩雑になるため私だったらやりません。
ご回答ありがとうございます。
規模によるとは思いますが、
将来的なことも考える(それが当たり前なんだと思いますが)と
結構いろいろ考えて設計していかないと駄目そうですね。
No.1
- 回答日時:
命名規則をきっちり決めて、統一させて、ドキュメント化して、
だれがいつ見ても意味が分かるカラム名であれば何でもいいでしょう。
はっきり言って、設計ポリシーの問題です。
人工キーか自然キーか
って問題もポリシーの問題ですから、貴方の考えを自由に反映させてください。
ご回答ありがとうございます。
なるほど、最終決定は自分でしなければいけないのは当然だと思いますが、
あえて聞きたいのですが、
inu2さんならこのケース(連番を主キーにして、ユーザが決める文字列(ID)はUNIQUEにして同じテーブル内に配置するケース)なら
連番を~seqにしますか?それとも~idあるいは別のカラム名にしますか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL PHPとMySQLを使った掲示板の作り方 1 2022/06/02 13:00
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- MySQL あと、MySQLの文字コードはutf8 気になりますね 1 2022/12/01 07:22
- その他(データベース) カラム上の重複を削除するクエリを教えてください 3 2022/04/12 14:11
- その他(プログラミング・Web制作) google formsを使ったタスク依頼フォーム作成におけるご相談 1 2023/06/22 15:55
- MySQL テーブル作成時のカラムについて 2 2022/08/27 21:48
- Oracle sqlで質問です。 idを元にidに紐付くデータで住所コードがjpのみのデータ以外のidを取得したい 4 2023/03/20 17:41
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- JavaScript Json のキーと値の出力の違いについて 2 2022/06/14 20:22
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エラー 1068 (42000): 複数の主...
-
【Transact-sql】 execの結果を...
-
エクセルの関数について教えて...
-
sqlで、600行あるテーブルを100...
-
深い人、浅い人の判断
-
あるカラムの値を複数持つレコ...
-
Access パラメータクエリをcsv...
-
PL/SQLの変数について
-
2つのテーブルを繋げて条件をつ...
-
insertを高速化させたい
-
MySQLのint型で001と表示する方...
-
WordpressのContact form 7でzi...
-
VIEWの元のテーブルのindexって...
-
複数テーブルのGROUP BY の使い...
-
load dataするときに、最後の列...
-
[SQLServer] テーブル名からカ...
-
INで抽出した順番に並び替え(S...
-
1テーブル&複数レコードの更新...
-
【Excel+MySQL】select文で返っ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
select文のwhere句に配列を入れ...
-
VIEWの元のテーブルのindexって...
-
エラー 1068 (42000): 複数の主...
-
SQLにて特定の文字を除いた検索...
-
【Transact-sql】 execの結果を...
-
マイクラPC版のコマンドで効率...
-
SQL Left Join で重複を排除す...
-
sqlで、600行あるテーブルを100...
-
複数テーブルのGROUP BY の使い...
-
WordpressのContact form 7でzi...
-
クエリ表示と、ADOで抽出したレ...
-
SQLサーバから、項目の属性(型...
-
selectした大量データをinsert...
-
Access パラメータクエリをcsv...
-
副問合せの書き方について
-
inner joinをすると数がおかし...
-
insertを高速化させたい
-
[MySQL] 3つのテーブルの結合で...
おすすめ情報