- - PR -
主キーの設定について
1|2|3|4
次のページへ»
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-11-07 00:15
みなさん、こんにちは。
はじめまして。 // Database Expertへの投稿ははじめてです。 PostgreSQL 7.4.8を使用しております。 年月日を保持するレコードがあります。 以下はテーブルのSQL文です。 CREATE TABLE test( title varchar(100), year integer, month integer, day integer, primary key(year, month, day) ) 用途としては、指定の年月日のレコードが特定できればと思っております。 思ったのですが、 year,month,day の三つのフィールドを主キーにしておりますが、 ymd timestamp というフィールドに置き換えて、そのフィールドを主キーにした場合とで、どちらがよいか迷っています。 ご助言いただけると幸いです。 よろしくお願いします。 | ||||
|
投稿日時: 2005-11-07 00:48
主キーの意味合いとしては、重複データさえなければどちらでも良いでしょう。
とは言いつつも私は、後者がお勧めですね。(並び替えもしやすい) でも、timestamp 型としては使わないことが多いでしょう。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2005-11-07 01:03
私もじゃんぬさんと同じような意見です。
私の経験上(DB設計に関与しない場合も含む)では、 CHAR(8)を使用して、'YYYYMMDD'で格納しているパターンが多かったです。 それが正解と言うわけではなく、 あくまで「多かった」というだけですので誤解しないで下さいね。 #追記 半角の「8」と閉じ括弧で絵文字になるのね・・・ [ メッセージ編集済み 編集者: かつのり 編集日時 2005-11-07 01:28 ] | ||||
|
投稿日時: 2005-11-07 01:14
私は NUMERIC(8) というのも多く見ています。 もちろん、0 パディングです。 ですが、CHAR 型の方が容量も少ないので、私自身は CHAR 型派かなぁ。 DB によっては、NULL の考慮のため VARCHAR2 (これは Oracle の場合) にしたりします。 TIMESTAMP 系の型は、日付計算の時くらいにしか使いません。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2005-11-07 13:04
どもです。がると申します。
個人的にはtimestanpをお勧めします。ただ、多くの場合、 timestampは年月日時分秒のデータであることが多かった 用に記憶をしてはいるのですが。 ちなみに、個人的には日付をintやchar型で持つのは あまり好まないです。 というのも、この手の型で持つと「プラス1ルール」が 必ず必要になり(int型だとレコードの離散とか、char型 やnumericだとyyyymmddなのかyyyy-mm-ddなのか、 0パディングはするのかしないのか、など)、大抵そういった ルールを破る人のおかげで苦労させられるので :-P 厳密には「年だけを条件にselectしたい」時などで DBへの処理コストが…とかって問題もなくはないのですが。 そういった「カリカリした」所でなければ、「日時を表す」 という風に役割がはっきりしているtimestampのほうが、 後々でメリットを享受しやすいと思うです。 後はまぁ「現場の流儀」とか色々あるのですが :-P | ||||
|
投稿日時: 2005-11-07 13:19
じゃんぬねっとさん、ご返信いただきましてありがとうございます。
かつのりさん、ご返信いただきましてありがとうございます。 やはり、year, month, dayでフィールドを分けるよりも、ymdなどに YYYYMMDD として、フィールドを設けて運用したほうがよさそうですね。 よく考えたらそうですね。 timestampで持つ必要はなくて、CHAR(8)で持たせておけばよいですね。 改めて自分の浅はかさを暴露(?)してしまいました。 皆様よりご教授いただきました方法にて、再度テーブルを構築します。 ご教授いただきまして、本当にありがとうございました。m(_|_)m | ||||
|
投稿日時: 2005-11-07 17:02
がるさん、ご返信いただきましてありがとうございます。
>個人的にはtimestanpをお勧めします。ただ、多くの場合、 >timestampは年月日時分秒のデータであることが多かった >用に記憶をしてはいるのですが。 > >ちなみに、個人的には日付をintやchar型で持つのは >あまり好まないです。 なるほど。なるほど。 今回日付を持つようにした経緯としまして、ハッピーマンデーにともないユーザが祝日を自分で設定したいという要望がありました。 そこで、祝日テーブルの登場とあいなった訳なのです。 がるがるさんのご意見を聞くと、ごもっともとも思いますし・・・。 悩みどころですね。 ん〜、とりあえず今回はchar(8)でテーブルを再設定してみようと思います。 | ||||
|
投稿日時: 2005-11-07 18:36
私は主キーとなるフィールドに日時型を使うことに反対な人です。
日付の内部表現形式や精度は言語やデータベースによって異なります。同じ値を格納しているつもりでも、内部表現形式の違いから誤差が生まれるかもしれません。特定レコードを指定する意味合いで使う場合、意図したレコードが更新されないかも知れません。 #それとも、私は考えすぎ? _________________ 甕星 <mikahosi@abox9.so-net.ne.jp> http://blogs.msmvp.jp/mikahosi/ |
1|2|3|4
次のページへ»