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

データベース(PostgreSQLやMySQLなど)でテーブルを作る際について

例えばPHP+PostgreSQLでサイトを構築し、
フォームからの入力内容を受け取りデータを登録する際は、
その入力された内容を登録する前にPHPで細かくチェックすると思うのですが、
テーブルを作る段階でも CHECK を使って条件を設定しておくものなのでしょうか?

念には念を入れてと言うのであればそうするとは思うのですが...

「普通はこうする」というような一般的な使い方を教えてください。
また、こういう場合はこうするというご意見もありましたらお願いおします。

よろしくお願いします。

●質問者: worldtravel
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:MySQL PHP postgreSQL うご サイト
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● furutanian
●20ポイント

DB にはあまり詳しくありませんが、参考までに。

CHECK 制約を設定しても別に問題はないですが、制約に引っかかるデータを INSERT しようとした場合、DB からエラーが返ってきますから、どっちにしろ PHP 側での対処が必要になりますよね?

私なら PHP 側で細かくチェックしているなら、よほどの理由がない限り DB 側には CHECK を設定しないと思います。が、これは、設計する方の好き好きじゃないですかね。

一方で、time() の結果は、よほどの理由がない限り CHAR(10) でなく INTEGER で格納するべきでしょう。数値で返ってきている情報を、わざわざ文字情報に変換して格納する理由はありません。64bit マシンなら BIGINT を使う必要がありますが、そもそも時間情報ならば、その場で変換して TIME 型や DATE 型で格納するほうがいいんじゃないですかね?

◎質問者からの返答

ありがとうございます。

CHECKに関しては参考にさせていただきます。

time() の件に関しては幾つか希望があります。

まず、できるだけPostgreSQLとMySQLの両方で使えるデータ型で書きたいと考えております。

また、年月日時分秒を記録したく、表示する際も色々と表示方法を変えられる用にと考えております。

(「年/月/日 時:分:秒」と表示したり「年/月/日」だけと表示したり...など)

ですので、time()で取得した数字を入れておき、表示するときはDBから呼び出したデータを下記のようにするのが良いのかなと思って質問させていただきました。

$date = strftime('%G/%m/%d %H:%M:%S', $time);

そうするなら、こうしたほうが良いというような方法がありましたら教えてください。

(今後登録した時刻として使うので1970年以前は無視して構いません)

よろしくお願いします。


2 ● もすぴー
●40ポイント

DBチェックは、登録する内容によりけりでしょうか。

たとえばアンケートとかBBSとかなら別にいらないでしょうし、

会員データとかお金に絡むようなデータとかなら入れるべきでしょう。

プログラムでチェックしていても、結局バグなどで違ったデータを入れる可能性はあります。最終防衛ラインとしては入れて損はないと思います。ただあまりガチガチに固めると後で融通が利かなかったり、開発中が不便だったりしますよね・・。この辺りの加減が難しいところです。

日付はtimtestampとかdateにしています。登録時にはSQLのnow()を使ってDB側に任せています。

◎質問者からの返答

やはりどのくらい重要なのかで変わるのですね。

「最終防衛ライン」

これは確かにそうですね。

バグでとんでもないデータが入ってしまうかもしれないことを考えると...

入れることにしようと思います。

日付に関してはやはりPostgeSQLとMySQLで分けた方がよいのですかね...

ありがとうございました。


3 ● furutanian
●20ポイント

$date = strftime('%G/%m/%d %H:%M:%S', $time);

とするなら、間違いなく INTEGER がいいでしょう。

DB 側に統一的な機能があれば、DATE 型のがいいだろうと思って調べてみたところ、

http://homepage1.nifty.com/kojama/works/rdbms/mysql/sql.html

表示フォーマットを指定する方法は、見事にバラバラで、同じ SQL が使えないようですね。

やはり、INTEGER 型がベストでしょう。

◎質問者からの返答

やはりどちらでも、となるとINTEGER 型がベストなんですね。

両方で使えることを前提とする場合はそうしようと思います。

ありがとうございました。

関連質問


●質問をもっと探す●



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