人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQLでもPostgreSQLでも何でも、日時を格納するためのデータ型が用意されているRDBMSで日時データを数値型で格納するように設計する奴ってバカなんですか?

●質問者: americanboss
●カテゴリ:コンピュータ 趣味・スポーツ
✍キーワード:MySQL postgreSQL RDBMS データ 設計
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● yoshifumi1975
●26ポイント

個人的にはバカというか嫌です。SQL92やSQL99で専用の型が用意されているんだから使うべきでしょう。

第一、メンテナンスするときに、型を見ただけでそれが日付や時刻を表すことが一目瞭然ですし。

でも、もしかしたらRDBMSの負荷をほんの少しでも下げるための工夫なのかも。

でもやっぱり見たときに素直にわかりやすいほうがいい。

◎質問者からの返答

確かにRDBMSとしては数値でそのまま扱えて便利でしょうが、RDBMSの外で使用する場合に結局変換しなければなりませんよね。ソートや比較時には有効なんでしょう、きっと。

クソ重ったいテーブルの中でチューニングの一環として数値型で定義されているのであれば、確かに納得です。


2 ● ken33jp
●5ポイント

数値型でも、どのような値を入れるかにもよります。

http://cocohome.hp.infoseek.co.jp/perl_ref/time.html

このような数値を格納するのは、馬鹿じゃないですかね。

-----

文字列として格納する設計も良くありますよ。

日時型を使うと落とし穴がありそうで個人的には怖いです。

◎質問者からの返答

Unix Time以外に入る数値型ってありますかね?

YYYYMMDDHHMISSで入ることを想定してbigintとか定義する人は大馬鹿ですか?


3 ● chuken_kenkou
●34ポイント ベストアンサー

日付演算(○ヶ月後を求める、○日後を求める、○日間かを求める、○年○月のデータを対象にする)などがなかったり、数値から日付への変換処理が不要なら別に数値で管理してもいいと思います。

しかし、アプリ側で数値→日付、あるいは日付→数値変換処理を準備し、しかもシステム内の共通処理として持つのは、あまり効率的とは思えません。

各RDBMSも、日付型を実装し、操作性や性能改善もされています。そこであえて日付を数値で管理するというのいは、あまりメリットを感じないし、今後のシステム拡張性、あるいは一部分を異なるRDBMSで管理するなどでの移植性などでもデメリットが多いと思います。

◎質問者からの返答

日付演算がなくても、当該カラムに条件をつけてSELECTする際のSQL文の可読性も落ちるのではないかと思います。

UnixTimeを見た瞬間に「ああこれは何月何日の何時何分何秒だよ」と言うことが、プログラマーはもちろんシステム利用者が言えるような世の中なら全然問題なさそうですね。


4 ● haruo-31
●18ポイント

確かに僕もバカだと思うし日付型で管理した方が良いと思っていますが、とあるDBで月上期下期などを表現するときに日付型で入れられない数値を組み込むことで対応しているのを見たことがあります。形式はVARCHAR2でした。

たとえば上期なら20080800(yyyymmdd)なんて言う感じで。

「なんか心情的に日付型はわかりにくい」なんて言う人はこの業界でも結構居たりしますしね〜。

◎質問者からの返答

納期や未来のあいまいな日付といったデータが格納されるカラムだと、YYYYMMDDにして年度末という表現を"20090332"と定義できるようにするのはアリかもしれません。

「自分が心情的にわかりにくい」という理由で、デメリットの多い設計にする奴は馬鹿なのかが気になります。


5 ● ひつじおとこ
●17ポイント

大量のデータ(数千万とか数億とか)を日付を条件に検索する要件がある時

「日付型の比較より数値での比較の方が高速である」という理由でこういった設計になる事が有るようです。

ただ、SQL上で日付演算をしようとするとこんな感じになって鬱になれる事請け合いですが...

http://q.hatena.ne.jp/1207912904

◎質問者からの返答

申し訳ありません、日付ではなく日時型です。

確かに日付型の場合は確かに"可変長文字列(8)"とかやりたくなりますが、演算の時に結局不利になるんですよね。数値(8)でYYYYMMDDとしても、"20080819"と"20080719"の差って"100"じゃないんですよねー。

まだ数値型にして86400区切りのUnixTimeで日付を定義したほうがマシってなもんです。

質問も読んでみましたが、結局、ある一定条件でハイパフォーマンスが出せても、それ以外のところで割を食う可能性の高い設計、ってことなんですよねきっと。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ