- - PR -
主キーの設定について
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2005-11-07 20:12
CHAR(8)で実装するほうが浅はかという解釈もあります。 | ||||
|
投稿日時: 2005-11-07 21:50
実際にどちらを選択すべきか迷いますね。
・データベース設計としての美しさ・効率 ・プログラムとの連携性 ・運用性 は、両立が難しいかなと思います。 結局はどこを重視するのかも選択の基準になるのではないでしょうか。 結果として整合性が保てれば、y/m/dを分けても、 yyyymmddでもtimestampでも問題はないのです。 | ||||
|
投稿日時: 2005-11-08 00:39
七味唐辛子さん
かつのりさん ご返信いただきまして、ありがとうございます。 > データベース設計としての美しさ・効率 > プログラムとの連携性 そうですね〜。 僕は、データベースの設計はあまりしなくて、プログラムを書くことが多い人間なのですが、そういう観点からどちらかというと、データベースの効率よりもプログラムからいかに楽して触るかということをどうしても最初に考えてしまいます。 データベースのテーブルを考えるときに思うのですが、データベース設計は本当に難しいなと思います。 | ||||
|
投稿日時: 2005-11-08 01:07
ポイントはどんなプログラムで何のために日付を使うかということですね。
それを明らかにすること、わからないなら聞くこと。 で、自分の好みで言うならPostgresなら日付のみを記録するdateがあったと思うので、多分それを使います。 個人的には扱うべきデータと型は一致させたいので _________________ http://aglabo.com/ @Homepage http://furukawa-select.com/mt/ @Blog | ||||
|
投稿日時: 2005-11-08 01:25
私もデータと型は一致させるに一票です。
整合性の維持は極力データベースに任せる主義なので。 ひどい例だと日付が入るべきカラムがいつの間にかそれ以外のデータも 格納するようになったシステムすら見たことあります。 主キーでも、最初は一件/一日であった前提が度重なる仕様変更で崩れて、 2005/11/3Aみたいなデータを無理矢理持たせる可能性だってないとは 言い切れません。というか、世の中には実在してそうで怖い。。 | ||||
|
投稿日時: 2005-11-08 08:53
別の意味を持つならば "別のフィールドを作らない" 理由がわかりませんが... まあ、そういうのは、プログラム中のソースでもありますね。 たとえば、日付なんかをソース上で扱う場合、形成などのため string で扱うことがあります。 変数なんていうのは、1 つに 1 つの意味だけを持つべきなのに、 別の意味を持つ中身が入っていたり、そういうのは見ます。 これも "別の変数を作らない" 理由がわからないんですよね。 目先のことだけを考えての設計はどの次元でも混乱の元です。 (機械設計、電子回路設計なんかも同じメに遭います) _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2005-11-08 10:17
あつしfxさん
あしゅさん じゃんぬねっとさん ご返信いただきまして、ありがとうございます。 貴重なご意見と、経験情報大変ありがとうございます。 今回は、カレンダーを表示するプログラムで、該当する日付が祝日だった場合、カレンダーをマーキングします。 データベースへは、2005年11月8日のレコードを抽出するといった感じで、アクセスしています。 そのカレンダーは、1画面に1ヶ月のカレンダーを表示します。 2005年11月のカレンダーだと、現在のプログラムでは、30回データベースにアクセスし、登録した祝日を検索します。 以上が、僕が今作ろうとしているプログラムの大枠の概要となります。 以前は年と月と日のフィールドを全て分けていたのですが、CHAR型(8)で、年月日のフィールドとしてプログラムを作成しました。 | ||||
|
投稿日時: 2005-11-08 11:08
30回もデータベースアクセスするのは効率悪いんじゃないですか?
SELECT day FROM holidays WHERE day like '200511%' のようなSQLを使って1ヶ月分の休日を取得し、あとはプログラム側で 処理したほうが良いと思います。 パフォーマンス重視であれば年+月のフィールドを別に用意して インデックスをつけておくのも良いでしょう。 | ||||
