• ベストアンサー

カラム名の付け方

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

質問者が選んだベストアンサー

  • ベストアンサー
  • togino
  • ベストアンサー率75% (97/129)
回答No.5

明確な回答というものがないのですが 私は以下の点に注意して名前をつけています。 ■ 対象を正確に表現しているか 例えばタイトルを表しているなら title のように 勝手に til みたいに略したり関係ない名前をつけない ■ 型を表現しているか 最近は型を意識しない言語が増えてきましたが SQL だと '' で囲む必要があるのかないのかを カラム名で確認できるようにすることもあります。 ■ 変数名が長すぎないか 上記の条件を満たすとなるとだんだん長くなります。 やはり長すぎると SQL だって長くなり見にくくなって しまっては、意味がありません。 ■ 別の名前空間に同じ名前が存在しないか 名前空間を分けて同じ名前を使うことは、自由に 名前をつけれることや、綺麗に対比させることが できるので見やすくなりはするのですが、 名前空間を付け忘れて、違う変数にアクセスしていた ということが起こらないとも限りません。 ■ 列挙した時に綺麗に並ぶか 英語と日本語の違いが原因になることもありますが shop_view という変数を考えた場合、他に item_view custom_view のように変数が増え、view するもので まとめたい場合 view_shop ってしておいた方が 列挙した場合ソートするだけで、綺麗に並びます。 ■ 大文字小文字を使うか 大文字小文字が使える場合 MovieID ってした方が 変数名は短くなって nMovieID のように型修飾も しやすくなります。_ の方が見やすいって人もいる ので、かなり好みだとは思いますけど・・・ --- すみません。長々普段変数名をつける時に結構 悩むタイプなので、気にしていることを列挙してみました。 なにか参考になればいいと思います。 結局私なら CREATE TABLE movie (  movie_id SERIAL PRIMARY KEY,  title TEXT ); にしますね。 (SQL 予約語は大文字とか変なこだわりがありますが・・・) # 変数名やカラム名・関数名なんかは最初に適当に決めて # 必要に応じて一斉置換できるもんだといいのになぁ # まっその名前をデータにすることもあるので不可能 # なんだけど・・・(^^;)

maruchan0488
質問者

お礼

アドバイスありがとうございます。 勝手に注意点を上から番号振りました。 注意点 1 これはそうですね DBに限らず 注意点 2 これもプログラムを作るときに 変数名に付けている人をたまに見ます。 注意点 3 変数名が長いと起こられる言語もありましたしね。。。 注意点 4 同意 注意点 5 そうですね 注意点 6 出来れば私も nMovieID の書き方のほうがしっくりきます。

maruchan0488
質問者

補足

皆様たくさんのアドバイスありがとうございました。 いろいろ意見を頂いて 大変勉強になりました。 今回の設計では、toginoさんのカラム名の付け方で いこうと思いました。 これにて 勝手ながらこの質問を締め切らさせて頂きます。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • root139
  • ベストアンサー率60% (488/809)
回答No.4

「エンティティや属性、リレーションの名称はモデル全体でユニークにする」というガイドラインが在るそうです。 私は、テーブル名を見ずに属性名だけを見て何の属性か判断でき、かつ全体でユニークになる様にしています。 ただし、外部結合の結合条件となるような項目で、曖昧になる可能性が少なく、同じにした方がかえって分かりやすいと思われるものだけは同じ名称にしています。 例えば、会員テーブルと購入履歴テーブルの双方にある会員IDの属性は同じ名称にしていますが、購入履歴テーブルの金額の属性と都道府県別送料テーブルの金額の属性は違う名称になる様にしています。

maruchan0488
質問者

お礼

アドバイスありがとうございます。 状況によって属性名を変えるんですか、、、 それが出来るようになれば 一番いいんでしょうが これには 経験が必要ですね わかりやすい例で 頭では理解しました。。。

全文を見る
すると、全ての回答が全文表示されます。
noname#86752
noname#86752
回答No.3

私なら前者を使うと思います。理由は短くて使いやすく、可読性も損なっていない(と私は思える)からです。 他にidが出てきたときは「テーブル名.カラム名」と指定できますし、どうしても分かりにくければselectするときにasで別名をつけてやることもできます。 カラムは必ずテーブルに属していて一緒に出てきます。ですので、無理にテーブル名を頭につける必要はないと思います。

maruchan0488
質問者

お礼

アドバイスありがとうございます。 いろいろ意見が聞けて楽しいです。 初めての 前者肯定派がいてちょっとうれしい 私も 「テーブル名.カラム名」 これがあるから カラム名は短くていいのかなぁ と思っていましたが 今のところ 少数意見のようです。

全文を見る
すると、全ての回答が全文表示されます。
  • Mizyu
  • ベストアンサー率41% (245/593)
回答No.2

カラム名でも変数名でも言えることですが、命名時に重要視することは 「後でその名前だけ見たときに何かが明確にわかること」です。 そしてカラム名、テーブル名となるとSQLが長くなってしまうことも考慮して 「できるだけ、簡潔に」という条件も重要視したいです。 前者は簡潔ですが、idだけ見たとき、何のIDかわかりません。 テーブルと紐付けてはじめてMOVIEのIDだと判断できます。 後者はカラム名だけで何のIDか判断できますし、 困るほど長い名前でもないですので、私は後者を推薦します。

maruchan0488
質問者

お礼

アドバイスありがとうございます。 確かに 変数名を付ける時は 必ずどんな変数なのかわかるように名前を 付けています。 話は変わりますが、、、 DBを オブジェクト指向的に考えた場合 名前の付け方は 前者の方が しっくり来るような気がします。 オブジェクト指向を本格的にやっていないので 自信はないですが、、、すいません

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

私個人的には、後者です。 テーブルが複数になったら、IDというカラムがいっぱいできて、プログラムでわけわからなくなりますから^^;

maruchan0488
質問者

お礼

アドバイスありがとうございます。 そうですね IDはほとんどのテーブルにありますから

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • テーブルを作ろうとしたら。

    下記のようなエラー文が表示されます。 NOTICE: CREATE TABLE will create implicit sequence 'テーブル名とフィールド名をくっつけたような名前' fo r SERIAL column 'テーブル名.フィールド名' NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index 'テーブル名_pke y' for table 'テーブル名' このデーターベースには他にもテーブルがありますが、 名前が主キーで名前が同じものがあるからエラーがでると思い、名前を変更して実行しましたが、同じような エラーがでました。 テーブル名とフィールド名をくっつけたような名前はもともとなかったものなのですが、実行後にデータベースに作成されました。 どなたかわかる方がいたら、ご教授お願いいたします。

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

    このジャンルでお願いします。 例えば次のようなアカウント情報を格納するテーブルがあったとして 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」のままなのですが、 みなさんはどちらのやり方をされているのでしょうか?

  • カラム名で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がつくカラム名は文字列 と直感的に分かりやすくなるだろうと思ったからなのですが、 みなさんはこのケース(そもそもこのカラム構成が正しいかは分かりませんが・・)の場合は、 どのようなカラム名を付けますか?

  • 漢字名のテーブルとカラムのCREATE TABLEについて

    Oracle9iで以下のCREATE文を実行しようと思っています。 漢字名のテーブルで、漢字名のカラムのあるCREATE文です。 SQL> CREATE TABLE "TAB_あいう"( 2 "かきコード" varchar2(5) NOT NULL , 3 "くけ開始月" varchar2(2) NOT NULL , 4 "フラグ" char(1) NOT NULL , 5 "さCD" char(6) NOT NULL , 6 "日時" date NOT NULL , 7 canstraint PK_FISCALTERM primary key ("かきコード")); canstraint PK_FISCALTERM primary key ("かきコード"))                            * 行7でエラーが発生しました。: ORA-00907: 右カッコがありません。 しかし、 ORA=00907;右カッコがありません。といわれてしまいます。 見た目、右かっこはあります。 なにか、お作法的なものがあるのでしょうか?

  • serial型について

    Postgresql7.2.4で user:postgresにより CREATE TABLE test (id serial PRIMARY KEY,num INT4) というテーブルを作成し、 GRANT ALL ON test TO PUBLIC と権限を与えました。 そしてPHP4よりuser:nobodyで INSERT INTO test (num) VALUES (1) というクエリを実行しようとすると ERROR: test_id_seq.nextval: you don't have permissions to set sequence wash_h_test_id_seq in test.php とでます。 しかし INSERT INTO test (id,num) VALUES (1,1) とするとちゃんとデータベースに反映されます。 PHPで、このユーザーからserialを使った自動連番で 書き込めるようにするにはどうすればいいのでしょうか。

  • postgreSQLのCOPY コマンド&serial型について。

    はじめまして。 最近からpostgreSQLを使ってデータベースを作っています。初めてのデータベース作成なので、少し手間取っていますが、宜しくお願いします。 テキストエディタを使って、タブ区切りで保存したファイルは、postgreSQLに、\copyコマンドでテーブルの中へ 流し込むことができると思いますが、テーブルを作成した際に、 CREATE TABLE ***(←テーブル名) (id SERIAL PRIMARY KEY,○○ △△,..........,); とテーブルを作ったのですが、1列目のSERIALが邪魔をするのか、COPYコマンドを使ってもテーブル内にデータが入っていきません・・・ エラーは『": can't parse "ne 119, pg_atoi: error in "』と返ってきます。 タブ区切りテキストファイルで、一括登録する際、serial型でうまく自動発番できるファイルの書き方とかありますか? 現在、仕事でデータベースを作っているのですが、扱っているデータの数が、12万件近くあるので、全てを手動で登録するのは、ちょっとキツイです・・・ 回答の方、宜しくお願いします。(質問の内容が、うまく伝わっていなかったら、ゴメンナサイ。)

  • 他テーブルの集計結果を別テーブルのカラムに格納

    新規テーブル作成時にあるカラムに別のテーブルの集計結果を入れることはできるのでしょうか? 例えば、商品を定義したテーブルの中に、その商品が合計いくつ売れているかを集計するカラムを設置し、常に発注テーブルからその商品の合計発注数を引っ張って来て格納するイメージです。 テーブル作成時のみ集計するではなく、常に参照し動きがあれば数値が自動で変わるようになる方法を探しています。 いちいちselectで集計しなくても始めからカラムに集計値が入っていれば楽だなぁと思い質問しました。 どなたかわかる方いらっしゃいましたらよろしくお願いします。 商品テーブル CREATE TABLE product ( product_no SERIAL NOT NULL, (商品id) product_name VARCHAR(200) NOT NULL, (商品名) product_price VARCHAR(20) NOT NULL, (料金) product_sum INTEGER, (合計発注数)←ここ PRIMARY KEY(product_no) ); 発注テーブル CREATE TABLE order ( order_no SERIAL NOT NULL, (発注id) product_no INTEGER NOT NULL REFERENCES product(product_no) ON UPDATE CASCADE ON DELETE CASCADE,(商品id) order_num INTEGER NOT NULL,(その商品の発注数) order_date TIMESTAMP,(発注日) PRIMARY KEY(order_no) );

  • 簡単に正規化したい

    プログラム素人です。 初心者なのでこんなテーブルを思いつくのですが、これってカラムをいちいち作らないといけないので後のメンテが大変な気がします CREATE TABLE hoge( id INT PRIMARY KEY, item1 VARCHAR(255), value1 INT, item2 VARCHAR(255), value2 INT, item3 VARCHAR(255), value3 INT ); こんな感じのテーブルにどんどんINSERTしていきたいのです CREATE TABLE hoge( id INT PRIMARY KEY, item VARCHAR(255), value INT ); 聞きたいこと MYSQL側 IDにPRIMARY KEYが付いているのですが2つ同じPRIMARY KEYはINSERTでききませんよね?どうすればいいでしょうか? perl側 IDごとにまとめて取得して配列に入れる方法はありますか? idが1のアイテムを全部取得して配列に入れる方法がわかりません(他にいい方法があったらお願いします) よろしくお願いします

    • ベストアンサー
    • MySQL
  • 続oracleのプライマリ・キー名の変更について

    oracleのテーブル名を変更します。 運用上ネーミングルールとしてプライマリ・キー名はpk_テーブル名としていますので、 プライマリ・キー名もこの時に変更したいのですが、適切な手順を教えてください。 旧テーブル名:table_a 旧プライマリ・キー名:pk_table_a  ↓ ↓ ↓ 新テーブル名:table_b 新プライマリ・キー名:pk_table_b という質問をさせて頂きました。 回答を頂き、一旦納得した気がしたのですが、どうもうまくいきません。 下記を実行すると4のところでコケます。 既にオブジェクトが存在するというものです。 どうやら 2のところのプライマリキー名変更がうまくいっていないか pk_table_aがどこかにゴミとして残っているように思えます。 オブジェクトブラウザというツールで見てみると、 CONSTRAINTにpk_table_bが INDEXのところにpk_table_aが見えています。 手順がおかしいのか? コマンドが間違えているのか? それともプライマリキー名の変更はしない方が良いのか? ここら辺を教えてください。 --1.TABLE 作成 CREATE TABLE table_a ( ITM1 VARCHAR2(10) NOT NULL, ITM2 DATE, CONSTRAINT pk_table_a PRIMARY KEY (ITM1) USING INDEX ) / --2.プライマリキー名変更 ALTER TABLE table_a RENAME CONSTRAINT pk_table_a TO pk_table_b / --3.テーブル名変更 RENAME table_a TO table_b / --4.「1」と同じTABLE 作成 CREATE TABLE table_a ( ITM1 VARCHAR2(10) NOT NULL, ITM2 DATE, CONSTRAINT pk_table_a PRIMARY KEY (ITM1) USING INDEX ) /

  • 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