わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

DBゼミのアドバイス〜CREATE TABLE

DBゼミは画面案のチェックを終え,実装段階へと入っていきました.
データベースへの操作として,最初に実行するのは,CREATE TABLE文です.
3年生が作成したコードを見たところ,名称や型について,まずいところが目につきました.
そこで何通か,改善指示のメールを送りました.以下は学生に送ったメールを,当ブログのスタイルに置き換えたものです*1

ススペルは恥ずかしい

綴りの間違いは恥ずかしいので,修正しましょう.
「adress」ではなく「address」です.「passward」ではなく「password」です.
Wordを開いてCREATE TABLE文を貼り付ければ,簡単にスペルチェックができますので,活用してください*2

できるだけ簡潔に

カラム名は字数を減らせないか,常に意識してください.
メールアドレスに関するカラム名に「emailaddress」と書いていますが,「email」のみにしましょう.
membersテーブルで,member_name,member_address,member_birthdate,member_age,member_sexというカラム名は冗長です.name,address,birthdate,sexのみとし,年齢はbirthdateと日付から計算するようにしましょう.

テーブル名を複数形,カラム名は単数形

テーブル名を複数形で統一するということですね.それで,差し支えありません.なお,テーブル名を複数形とするのは,Ruby on Railsの普及に伴う,比較的新しいルールなのは,知っておいてください*3
ただし,カラム名は単数形を基本としてください.
カラム名に「reasons」と書いていますが,この基本ルールに従って「reason」としましょう.

名前は小文字

テーブル名・カラム名とも,小文字で統一してください.
CREATE TABLEやSELECTなど,SQLのキーワードは,大文字で書くのが慣習です(が,動作確認の際には,小文字でかまいません).
型名は,大文字または小文字のいずれかで統一しておけば,それでOKです.個人的には,Cの型との関連のほか,PostgreSQLのマニュアルでは小文字で書かれていることから,型は小文字にすることを好みます.

主キーはintにしない

主キーとなるカラムについて,型を「int」としていますが,これだとレコードを追加する(INSERT文を実行する)たびに,追加する側が値を設定する必要があり,面倒です.
「serial」に置き換えてください.
serial型を使う場合,レコードの追加でそのカラム名を書かないことと,シーケンスと呼ばれるもの(テーブルと同類です)が暗黙のうちに定義されることには,注意をしてください.
外部キーについては,intのままでかまいません.

日付はdate

日付に関するカラムは,date型を原則としてください.もし,分または秒の単位まで必要なら,timestamp型です.
「支払期日」に関するカラム名をmaturityと書いていますが,payment_deadlineのほうが明快です.なお,payment_dateも「支払期日」の意味ですが,「支払いをした日」と誤解される可能性があるので,避けましょう.プログラムを書く我々は,英語ネイティブでも,金融の専門家でもありませんからね.

文字列はcharを使わない

文字列を格納するための型に「char(20)」と書いていますが,SQLの「char(サイズ)」は固定長文字列を意味し,非効率です.「text」に置き換えてください.
text型が標準のSQLにないというので,不安を覚えるなら,charはvarcharに置換し,そのサイズ(最大字数)には注意を払ってください.
なお,UTF-8で日本語文字列を格納する場合,サイズは文字数の3倍にしないといけないかというと,そういうわけではありません.PostgreSQLでは,サイズはバイト数ではなく文字数の意味になります.

値の意味も書く

「rightandwrong int,」は分かりにくいです.カラム名は,概念設計で書いていた「可否」の直訳のようですが,これは判定結果を意図していますので,decisionとしましょう.
そして次のように,コメントを使って,ER図のどの属性に対応し,どんな値をとるかを書いておきましょう.カンマはコメントよりも前に置きます.

  desicion int, -- 可否。0:否, 1:可, NULL:未決

マニュアルを読もう,Webで検索しよう

PostgreSQLのマニュアルはWebで読むことができます.バージョンごと,また節ごとに詳しく書かれていますが,まずは次のページを起点に,8.1(数値データ型)から8.6(論理値データ型)までを読み通してから,作ったCREATE TABLE文を見直し,置き換えると良いものがないかを,考えてみてください.

URLの中にある「8.4」はPostgreSQLのバージョンです.使用する(サーバの)PostgreSQLのバージョンは,ログインしてpsql --versionを実行すれば,知ることができます.
SERIAL型やシーケンスについては,以下のところなどを参考にしてください.

*1:実際には使われていない名前,行っていない指示があるのも,当ブログではいつものことです.

*2:ただし後で示す「payment_deadline」などの複合語にも,ミススペスの表示がつくのは,残念なところです.「_」を空白に一括置換すれば,一応,単語ごとのチェックはできます.テーブル名やカラム名をsnake_caseで書くことが前提です.

*3:Railsよりも,RubyActiveRecordや,「設定より規約」のパラダイムを挙げたいところです.なおhttp://www.geocities.jp/mickindex/database/celko/celko_trc.htmlによると,Railsの普及より前から,セルコ(Joe Celko)は「よくテーブル名を複数形(または集合名詞)で名付けるべきだと主張しています」とのことです.