• 締切済み

カラム名の付け方について

このジャンルでお願いします。 例えば次のようなアカウント情報を格納するテーブルがあったとして CREATE TABLE user (  id int(11) NOT NULL AUTO_INCREMENT,  name varchar(64),  email varchar(64),  password varchar(64),  PRIMARY KEY(id) ); idカラム名を「id」か「user_id」にするか悩んでいます。 自分としては「id」のままで良いと思っているのですが、 参考書や他の方のやり方を見てると「user_id」のようにしてる方もいます。 「user_id」にすることによってSQL文を見た時にも何のidかすぐ分かるし、 USING句を使えるなどのメリットがあるのでたしかにこちらの方が良いかなぁとは思うのですが、 「user_id」にするなら統一性をもたせるために「name」も「user_name」にするのか、 「email」も「user_email」にするのか、などキリがないというか・・・ そういう理由もあって自分としては「id」のままなのですが、 みなさんはどちらのやり方をされているのでしょうか?

  • MySQL
  • 回答数2
  • ありがとう数10

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

>例えば、楽天なんかはメールアドレスをログインのキー(ID)にしてますよね? >当然メールアドレスがuniqueになると思うのですが、 >その場合オートインクリメントidなどは設けているのでしょうか? 楽天が実際にどうしているかはわかりませんが、 ログイン名は当然ユニークな属性をつけているはずです。 ただし、ユーザー管理テーブルの場合ログイン名がプライマリーキーになることはまれで (1)ログイン名を変更しようとした場合 (2)ユーザーごとにログイン情報の履歴をとる場合 には、別のidが(裏で)利用されていると考えるのが妥当です。 (1)だと、メールアドレスはさまざまな理由で変更になる場合があります ユーザーIDさえ不変であればメールアドレスを何らかの方法で修正すれば 別のアドレスでも個人情報をひきつげます。 (2)の場合、フラグとからめればログイン名やユーザーIDは単一でユニークである 必要はありません。 ユーザーID+フラグで複合のユニーク属性をつけると、修正履歴をもつことができます ユーザーに実際に見せたり、ログインに利用したりするのはフラグの特定番号 たとえばフラグ=0のものは現在のユーザー情報、フラグ=1~5を履歴、などと定義すれば ユーザー管理の幅が広がります。 もちろん正規化して別テーブルで可変の履歴をとればフラグを使う必要はありません

takagoo100
質問者

お礼

ご回答ありがとうございます。 なるほど、たしかに履歴は取っておいたほうがいいですね。 参考になりました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

ユーザーテーブルの中だけでいえばidでもuseridでもuidでもなんでもかまいません。 別テーブルから参照する場合、idとしているとそれが何のidかをわかるように 命名した方が使いやすくなります。 RDBの場合、ほとんどのテーブルは「参照される」ので テーブルごとに異なるidでレコードを管理する場合、idという名称が 競合するため、結果としてidよりuser_idの方が使い勝手がよいでしょう。 おなじようにnameもuserの氏名としてしか使わないなら問題ありませんが companyテーブルにnameを設定しているならunameとcnameに分けた方がよいです。 ただし・・・ 今回のようにオートインクリメントでidを設定する場合、参照性が薄いかもしれません 単にレコードをユニークに判別するためのidで参照につかわないのであれば idのままでもOKです。 その場合、ユーザーを特定するための別の個別idをuser_idにした方がよいです。 たとえば社員番号とかその手の管理番号。

takagoo100
質問者

お礼

ご回答ありがとうございます。 >おなじようにnameもuserの氏名としてしか使わないなら問題ありませんが >companyテーブルにnameを設定しているならunameとcnameに分けた方がよいです。 なるほど、他のテーブルにあるかという基準で考えればいいわけですね。 参考になりました。 本題からずれて申し訳ないのですが、 一般的にアカウントを格納するテーブルのカラム構成ってどのようになってるのでしょうか? 例えば、楽天なんかはメールアドレスをログインのキー(ID)にしてますよね? 当然メールアドレスがuniqueになると思うのですが、 その場合オートインクリメントidなどは設けているのでしょうか? そのサイトの目的によってアカウントテーブルの構成は異なってくるとは思うのです、 必要最小限のカラムで構成する場合にyambejpさんならどのような構成にするのか教えて頂けないでしょうか?

関連するQ&A

  • usersテーブルの構成カラムについて

    MySQLバージョン4.1.16を使用しています。 このジャンルでお願いします。 よく全ての基本となるusersテーブル(IDとパスワードを入れるユーザの基本テーブル) があると思うのですが、それを構成するカラムはどのような感じにするのが良いのでしょうか? 自分は、 CREATE TABLE `users` ( `user_id` varchar(16), `password` varchar(255) default NULL, `col1` varchar(255) NOT NULL, `col2` varchar(255) NOT NULL, PRIMARY KEY (`user_id`), ) ENGINE=InnoDB; このように代替キー(連番)を使わずにuser_idを主キー(unique)にして構成します。 理由としては、uniqueな列があるなら、わざわざ連番を割り当てる必要もないし、 他のテーブルがuser_idを外部キーとして持った時に、その表の外部キーの列が 数字であるよりも見やすいかなと思ったからです。 ただ一般的に出まわっているPHPフレームワークなどのテーブル構成ではusersテーブルというか ほとんどのテーブルに連番を使っている例があります。 次のusersテーブルは、PHPフレームワークのCakePHPで使われるusersテーブルの構成の例で、 連番を使用しています。 CREATE TABLE `users` ( `id` int(11) NOT NULL auto_increment, `username` varchar(255) collate utf8_unicode_ci default NULL, `password` varchar(255) collate utf8_unicode_ci default NULL, `group_id` int(11) NOT NULL, `disabled` tinyint(1) NOT NULL, `created` datetime default NULL, `modified` datetime default NULL, PRIMARY KEY (`id`), KEY `group_id` (`group_id`), KEY `disabled` (`disabled`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 使用状況によって、どちらが良い悪いというのは変わるのでしょうけど 基本的にusersテーブルというのはどのような構成にすべきなのでしょうか? ちなみに自分は連番は○○_seqというカラム名にしてます(ただこれも 一般的には○○idを連番にしてるケースが多いので、どうすべきか迷っています・・・)

    • ベストアンサー
    • MySQL
  • comment on columnについてわからなくて困っています。

    CREATE TABLE の中で各列にコメントをつける方法はありますか? できなければ、以下の方法では、 ORACLE Express EditionのSQL実行で、 下記のコメントを一行ずつしか実行できないのですが、 1回で実行する方法はありますか? □作りたいテーブル CREATE TABLE DB_USER_MST ( DB_USER_ID VARCHAR2(5) NOT NULL, DB_PASSWORD VARCHAR2(5), DB_NAME VARCHAR2(30), DB_POSTCODE NUMBER(7), DB_PREFECTURE_ID NUMBER(2), DB_ADDRESS VARCHAR2(100), DB_TELEPHONE NUMBER(11), DB_SEX NUMBER(1), PRIMARY KEY (DB_USER_ID) ) □付けたいコメント COMMENT ON COLUMN DB_USER_MST.DB_USER_ID IS 'お客様ID' COMMENT ON COLUMN DB_USER_MST.DB_PASSWORD IS 'パスワード' COMMENT ON COLUMN DB_USER_MST.DB_NAME IS 'お名前' COMMENT ON COLUMN DB_USER_MST.DB_POSTCODE IS '郵便番号' COMMENT ON COLUMN DB_USER_MST.DB_PREFECTURE_ID IS '県ID' COMMENT ON COLUMN DB_USER_MST.DB_ADDRESS IS 'ご住所' COMMENT ON COLUMN DB_USER_MST.DB_TELEPHONE IS 'お電話番号' COMMENT ON COLUMN DB_USER_MST.DB_SEX IS '性別'

  • Oracleでテーブルを作成する際に、インデクスの作成先を指定したい。

    以下のようにテーブルを作成しようとしてます。 CREATE TABLE TEST_USER.M_USER ( ID char(4), NAME varchar2(40) NOT NULL), CONSTRAINT PK_USER PRIMARY KEY(ID) ); さて、プライマリキーを定義しているので、インデクスが作成されるはずです。 この作成先のテーブルスペースを指定したいのですが、方法が解りません。 CREATE TABLEの紹介をしているサイトにものっていなくて、途方にくれています・・・。 CONSTRAINT句を使えばいいのでしょうか?

  • ユーザ情報を格納するテーブルについて

    MySQLバージョン4.1.16を使用しています。 基本となるユーザ情報を格納するテーブルで、 自動インクリメントされるidというカラムを使用する場合と、 使用しない場合とでは、どちらが良いというのはあるのでしょうか? みなさんはどちらの形で利用しているのでしょうか? [userinfoテーブル] id使用 id UNSIGNED AUTO_INCREMENT PRIMARY KEY user_id VARCHAR(12) UNIQUE password TINYTEXT [userinfoテーブル] id使用しない user_id VARCHAR(12) PRIMARY KEY password TINYTEXT

    • ベストアンサー
    • MySQL
  • カラム名の付け方

    さっそくですが質問です。 データベースのカラム名の付け方についてなんですが 会社等で設計する時は、ルールに従ってカラム名等を 付けると思うんですが 個人で、自由に付けてもいい状態になったとき どのような 名前を付けていいか迷っています。 例:postgres create table movie( id serial primary key, title text ); か create table movie( movie_id serial primary key, movie_title text ); の二つのやり方か別の名前の付け方がいいのか 迷っています。 アドバイスがあったらよろしくお願いします。

  • TABLE名に使えない文字列をエスケープするには?

    aaa.bbbのように、TABLE名に.(ドット)を使いたいのですが、このままだとエラーが発生してしまいます。 mysql> CREATE TABLE aaa.bbb ( id MEDIUMINT NOT NULL AUTO_INCREMENT, abc varchar(16), xyz varchar(16), PRIMARY KEY (id) ); ERROR 1049 (42000): Unknown database 'aaa' .(ドット)をエスケープするにはどうすればよいでしょうか? ちなみに\(バックスラッシュ)を.(ドット)に前置してもエラーになってしまいます。

    • ベストアンサー
    • MySQL
  • テーブル作成時に1289エラーが出る。

    テーブル作成時に、ERROR 1289 (HY000): The 'InnoDB' feature is disabled; you need MySQL built with 'InnoDB' to have it working というエラーが出てしまいます。 どういった原因が考えられるでしょうか? Mysql5.0.15を使っています。 CREATE文 CREATE TABLE USER ( ID BIGINT NOT NULL AUTO_INCREMENT ,NAME VARCHAR(30) ,PRIMARY KEY (ID) ) type=InnoDB;

  • 表の結合と並べ替え

    次のようなテーブル構成で、 CREATE TABLE tbl1 ( id int PRIMARY KEY AUTO_INCREMENT ) ENGINE=InnoDB; CREATE TABLE tbl2 ( id int PRIMARY KEY AUTO_INCREMENT, name VARCHAR(32) ) ENGINE=InnoDB; CREATE TABLE tbl1_tbl2 ( id int PRIMARY KEY AUTO_INCREMENT, tbl1_id int, tbl2_id int, FOREIGN KEY(tbl1_id) REFERENCES tbl1(id), FOREIGN KEY(tbl2_id) REFERENCES tbl2(id) ) ENGINE=InnoDB; CREATE TABLE tbl3 ( id INT PRIMARY KEY AUTO_INCREMENT, tbl1_id int, created datetime, FOREIGN KEY(tbl1_id) REFERENCES tbl1(id) ) ENGINE=InnoDB; [tbl1] id 1 2 3 [tbl2] id  name 1   a 2   b [tbl1_tbl2] id  tbl1_id  tbl2_id 1   1      1 2   1      2 3   1      2 4   2      1 5   3      1 6   3      2 [tbl3] id  tbl1_id  created 1   1    2011-10-17 01:51:39 2   1    2011-10-17 02:51:39 3   3    2000-10-17 01:51:39 ここから次のような「tbl1のid」「tbl2の個数」「tbl3の最新のcreated」を基準とした (下の例は「tbl1のid」を昇順にした結果です) それぞれの並べ替た結果を得たいのですが、どのようなSQL文を記述すれば良いのでしょうか? [tbl1のid] [tbl2のnameのリスト] [tbl3の最新のcreated]   1         a,b,b      2011-10-17 02:51:39   2         a           3         a,b       2000-10-17 01:51:39

    • ベストアンサー
    • MySQL
  • auto_incrementを任意の数字から開始するには

    次のようなテーブルで入力するとidが1~始まりますが、 これを1000~開始する方法が分かりません、ご教授お願いします。 CREATE TABLE addressbook ( id smallint(4) UNSIGNED NOT NULL auto_increment, name1 varchar(20) default NULL, birthday date default NULL, PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET=sjis;

    • ベストアンサー
    • MySQL
  • 外部キーを持つテーブルを作成しようとするとエラーがでます

    XAMPPバージョン1.5.4 MySQLバージョン4.1.16 という環境で、my.cnfでInnoDBを使えるように設定しています。 そして CREATE TABLE admin_roles (id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(12) NOT NULL) ENGINE = InnoDB; という非参照列idを持つadmin_rolesテーブルを作り(成功し)、さらに role_idを外部キーとしてadmin_user_roleテーブルを作成しようとすると、 Error Number: 1005 Can't create table '.\test\admin_user_role.frm' (errno: 150) CREATE TABLE admin_user_role (userid VARCHAR(12) NOT NULL, role_id BIGINT DEFAULT 0, FOREIGN KEY (role_id) REFERENCES admin_roles(id) ON DELETE CASCADE) ENGINE = InnoDB; というエラーが出てしまいます・・・ admin_user_roleの記述のどこが間違っているのでしょうか?

    • ベストアンサー
    • MySQL