- PR -

主キーの設定について

投稿者投稿内容
どんたくお
ベテラン
会議室デビュー日: 2005/08/29
投稿数: 88
投稿日時: 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
というフィールドに置き換えて、そのフィールドを主キーにした場合とで、どちらがよいか迷っています。


ご助言いただけると幸いです。

よろしくお願いします。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-07 00:48
主キーの意味合いとしては、重複データさえなければどちらでも良いでしょう。
とは言いつつも私は、後者がお勧めですね。(並び替えもしやすい)
でも、timestamp 型としては使わないことが多いでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-11-07 01:03
私もじゃんぬさんと同じような意見です。

私の経験上(DB設計に関与しない場合も含む)では、
CHAR(8)を使用して、'YYYYMMDD'で格納しているパターンが多かったです。
それが正解と言うわけではなく、
あくまで「多かった」というだけですので誤解しないで下さいね。

#追記
半角の「8」と閉じ括弧で絵文字になるのね・・・


[ メッセージ編集済み 編集者: かつのり 編集日時 2005-11-07 01:28 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-07 01:14
引用:

かつのりさんの書き込み (2005-11-07 01:03) より:

私の経験上(DB設計に関与しない場合も含む)では、
CHAR(8)を使用して、'YYYYMMDD'で格納しているパターンが多かったです。


私は NUMERIC(8) というのも多く見ています。
もちろん、0 パディングです。

ですが、CHAR 型の方が容量も少ないので、私自身は CHAR 型派かなぁ。
DB によっては、NULL の考慮のため VARCHAR2 (これは Oracle の場合) にしたりします。

TIMESTAMP 系の型は、日付計算の時くらいにしか使いません。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
がるがる
ぬし
会議室デビュー日: 2002/04/12
投稿数: 873
投稿日時: 2005-11-07 13:04
どもです。がると申します。

引用:

どんたくおさんの書き込み (2005-11-07 00:15) より:
用途としては、指定の年月日のレコードが特定できればと思っております。
思ったのですが、
year,month,day
の三つのフィールドを主キーにしておりますが、
ymd timestamp
というフィールドに置き換えて、そのフィールドを主キーにした場合とで、どちらがよいか迷っています。


個人的にはtimestanpをお勧めします。ただ、多くの場合、
timestampは年月日時分秒のデータであることが多かった
用に記憶をしてはいるのですが。

ちなみに、個人的には日付をintやchar型で持つのは
あまり好まないです。
というのも、この手の型で持つと「プラス1ルール」が
必ず必要になり(int型だとレコードの離散とか、char型
やnumericだとyyyymmddなのかyyyy-mm-ddなのか、
0パディングはするのかしないのか、など)、大抵そういった
ルールを破る人のおかげで苦労させられるので :-P

厳密には「年だけを条件にselectしたい」時などで
DBへの処理コストが…とかって問題もなくはないのですが。
そういった「カリカリした」所でなければ、「日時を表す」
という風に役割がはっきりしているtimestampのほうが、
後々でメリットを享受しやすいと思うです。

後はまぁ「現場の流儀」とか色々あるのですが :-P
どんたくお
ベテラン
会議室デビュー日: 2005/08/29
投稿数: 88
投稿日時: 2005-11-07 13:19
じゃんぬねっとさん、ご返信いただきましてありがとうございます。
かつのりさん、ご返信いただきましてありがとうございます。

やはり、year, month, dayでフィールドを分けるよりも、ymdなどに
YYYYMMDD
として、フィールドを設けて運用したほうがよさそうですね。

よく考えたらそうですね。
timestampで持つ必要はなくて、CHAR(8)で持たせておけばよいですね。
改めて自分の浅はかさを暴露(?)してしまいました。

皆様よりご教授いただきました方法にて、再度テーブルを構築します。

ご教授いただきまして、本当にありがとうございました。m(_|_)m
どんたくお
ベテラン
会議室デビュー日: 2005/08/29
投稿数: 88
投稿日時: 2005-11-07 17:02
がるさん、ご返信いただきましてありがとうございます。

>個人的にはtimestanpをお勧めします。ただ、多くの場合、
>timestampは年月日時分秒のデータであることが多かった
>用に記憶をしてはいるのですが。
>
>ちなみに、個人的には日付をintやchar型で持つのは
>あまり好まないです。
なるほど。なるほど。
今回日付を持つようにした経緯としまして、ハッピーマンデーにともないユーザが祝日を自分で設定したいという要望がありました。

そこで、祝日テーブルの登場とあいなった訳なのです。

がるがるさんのご意見を聞くと、ごもっともとも思いますし・・・。
悩みどころですね。

ん〜、とりあえず今回はchar(8)でテーブルを再設定してみようと思います。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-11-07 18:36
私は主キーとなるフィールドに日時型を使うことに反対な人です。

日付の内部表現形式や精度は言語やデータベースによって異なります。同じ値を格納しているつもりでも、内部表現形式の違いから誤差が生まれるかもしれません。特定レコードを指定する意味合いで使う場合、意図したレコードが更新されないかも知れません。

#それとも、私は考えすぎ?
_________________
甕星 <mikahosi@abox9.so-net.ne.jp>
http://blogs.msmvp.jp/mikahosi/

スキルアップ/キャリアアップ(JOB@IT)