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


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

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

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

よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2006/10/23 12:17:46
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:furutanian No.1

回答回数112ベストアンサー獲得回数14

ポイント20pt

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

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

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

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

id:worldtravel

ありがとうございます。

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

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

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

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

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

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

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

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

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

よろしくお願いします。

2006/10/22 01:08:04
id:guki No.2

回答回数51ベストアンサー獲得回数1

ポイント40pt

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

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

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

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

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

id:worldtravel

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

「最終防衛ライン」

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

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

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

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

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

2006/10/22 01:05:32
id:furutanian No.3

回答回数112ベストアンサー獲得回数14

ポイント20pt

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

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

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

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

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

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

id:worldtravel

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

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

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

2006/10/22 01:07:05
  • id:worldtravel
    追記ですいません。

    元の質問とは関係ないのですが、
    PHPにて time() で取得できる10桁の数字は
    テーブルを作る際、データ型はどうするのが一般的でしょうか?

    INTEGER、CHAR(10)、それとも?

    よろしくお願いします。
  • id:b-wind
    質問が終わってしまっているのでコメントで。
    DB屋として言わせてもらうと、CHECK 等の制約は入れるべきだと考えます。
    PHP 等のフロントエンドのみからしか「絶対に」アクセスが無いなら不要なオーバーヘッドにしかならないですが、実際の運用ではアプリケーションのミスによる誤データ、障害時の手動でのデータ復旧、システム拡張による別アプリケーションからのアクセスなど間違ったデータが入る余地はいくらでもあります。
    もちろん小規模なサイトなどの場合さほどの必要性を感じない場合もあるでしょうから、ケースバイケースですが。
  • id:worldtravel
    b-wind さんへ

    ありがとうございます。
    この質問は先日終了してポイントも振り分けたはずなのですが.....
    いま「終了」ではなく「締切」になっているのに気付きました。
    そこそこ重要な用途では万一を考えて制約を入れようと思います。
    ご丁寧にありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません