• ベストアンサー

構造を教えてください。

php5mysql5にてホテルの予約システムのようなものを作りたく思っております。 予定の仕様としては2月分の(今月が9月だった場合は翌月の10月分)のカレンダーを表示させます。 2月分を一気に表示させるのではなく1月分づつ表示させる感じです。 管理側はいつの日に何人空いてるかを管理ページから変更できるようにしユーザーは空いてる日に 予約を入れるというよくありそうなものです。 一番悩んでいる箇所はmysqlのテーブル構造です。 基本的にはカレンダー表示なので単純ですが全ての月日をdbに登録する事になるのでしょうか? その場合例えば以下のようなテーブルになると思うのですが1年だけでも365日あるので厳しすぎるような・・・ id,data,base,num 1(ホテルid),2009-09-25(日付),5(全部屋数),3(空いている部屋数) としてbase-numで空いてる部屋数を割り出しユーザーが見るページに表示させるよう感じなのでしょうか? そして上記で割り出した数字が0でなければyoyaku.php?id=1&data2009-09-25とリンクにパラメータをつけ 予約ページへと移動する? と思っているのですがどのような方法で作るのが一般的なのでしょうか? 構造が明確になればイメージがわくのですが基本がわからずあやふやな状態です。 方法についてのアドバイスや参考になるようなurlの情報でも構いませんのでご存知の方が いらっしゃいましたら宜しくお願い致します。

  • dcx147
  • お礼率33% (214/636)
  • PHP
  • 回答数4
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • mdp36
  • ベストアンサー率72% (26/36)
回答No.3

時間単位の予約システムでよく見かける構成なら、 ・カレンダーテーブル・・・日別の営業時間や備考を保持する。 ・予約枠テーブル・・・特定の部屋、時間帯に予約できる上限を保持。定期的に予約枠マスタから作成する。 ・予約枠マスタ・・・曜日ごとの営業パターンを設定する。 ・予約テーブル ・顧客マスタ ・部屋マスタ ・予約‐予約枠関係テーブル・・・予約と予約枠を対応させる。非正規化で予約テーブルにマージされることも。 という感じですね。ホテルではないですが。 >1年だけでも365日あるので厳しすぎるような・・・ これは逆です。 1年で365件しか無いということは、100店舗で30年使っても1万件です。 この程度の量は全く問題ありません。 イメージがわかないとのことですが、プロトタイプを作りながら検討されるのはいかがでしょうか?

dcx147
質問者

お礼

お返事ありがとうございます。 テーブル設計は是非参考にさせて頂きます。 >1年だけでも365日あるので厳しすぎるような・・・ これは1つづつデータを作る事を想定していたのでDBのサイズではなく手間の問題でした^^; >イメージがわかないとのことですが、プロトタイプを作りながら検討されるのはいかがでしょうか? お恥ずかしながらプロトタイプというものを初めて知ったのですがどのような意味でしょうか? 参考までに教えて頂けますと幸いです。

その他の回答 (3)

  • mdp36
  • ベストアンサー率72% (26/36)
回答No.4

>プロトタイプ 日本語で言えば「試作品」ですね。 全体像がイメージできないなら、まず技術的に簡単だったり、データ構造が決まっている部分を作ってみて、その経験を踏まえて残りの部分の設計をしたほうが良い、という意味です。 http://ja.wikipedia.org/wiki/%E3%83%97%E3%83%AD%E3%83%88%E3%82%BF%E3%82%A4%E3%83%97 http://ja.wikipedia.org/wiki/%E5%8F%8D%E5%BE%A9%E5%9E%8B%E9%96%8B%E7%99%BA

dcx147
質問者

お礼

なるほど。phpプロトタイプで検索したのですがクラスの記述がヒットし?でしたが解決です。 皆様より頂いたアドバイスを基に作り始めてみたい思います。 ご丁寧に教えてた頂きましてありがとうございました!

回答No.2

> せめて1年分の日付だけでもcsvで自動出力してくれるようなものがあれば とのことなのですが、自分も種々のシステムで構築案件で #1さんと同じようにカレンダーテーブルを作成することがよくあります。 Excelのオートフィル機能を使うと、目的の形のCSVが1年分だろうと10年分だろうと 同じ操作であっという間にできるので楽ですよ。 あとはおっしゃるとおり、インポートすればOKです。 本質とは外れますが、ご参考までに。 がんばってくださいね!

dcx147
質問者

お礼

なるほど!エクセルの手がありましたね!だいぶ作業が軽減できそうでうです。貴重なご意見ありがとうございます。

noname#94983
noname#94983
回答No.1

だいぶ昔になるが、旅館の予約システムの案件を請けたことがある。このときは、もっとも頻繁に参照されるのが「指定した日の空き室状況」になる、ということだったので、以下のような形でテーブルを用意した。 ・空き室状況テーブル プライマリキーに年月日を示す値(20090925とか、それぞれの使いやすい形式のユニークな値)を用意し、全室の部屋番号のフィールドを用意した。 ・顧客テーブル 通し番号のプライマリキー(顧客ID)に、顧客の名前や住所などの個人情報を一通り用意した。 指定した月の予約状況を見る際には、その月の1日から末日までの範囲で検索をし、取得したレコードの各部屋の値をチェックして空き室状況を表示していく。 部屋の予約は、登録された顧客のIDでログインし、予約をすると、空き室状況テーブルの指定の年月日レコードの指定の部屋番号のフィールドに顧客のID番号を登録する。 顧客が予約の状況を確認したいときは、空き室状況テーブルで、各部屋のフィールドに顧客のIDがあるものを検索し一覧表示する。 まぁ、ざっとこういう感じだった。ただ、これがいいわけではまったくなくて、当時、既にある程度できてたシステムを踏襲して作らないといけなかったため、こういうシステムになった。正直、ネットの予約システムが珍しい頃だったので、この程度でもOKだったんだと思う。 今作り直すなら、「客室テーブル」「日付テーブル」「顧客テーブル」「予約テーブル」という具合に細分化し、わかりやすくするだろう。予約が入ったら、ユニークな予約番号を発行し、客室テーブル、日付テーブル、顧客テーブルにそれぞれ新しいレコードを登録する。そして、それらのレコードのID番号と予約番号を、予約テーブルに保管する。これで、客室・日付・顧客・予約番号のいずれからでも、調べたいところに保管されているID番号を取得し、それを使って他のテーブルを検索して必要な情報を取り出すことができる。またそれぞれを切り分けることで、例えば補足情報などのフィールドを追加し、テキストで必要な情報を追記できたりして便利だろう。 >yoyaku.php?id=1&data2009-09-25とリンクにパラメータをつけ >予約ページへと移動する? まあ、これはいろいろ考え方があると思う。セッションで保管する場合もあるだろう。これはシステムの設計によるだろうから一概にどれが一番とはいえない部分がある。それこそシステムを詰めてからでないとわからないんじゃないだろうか。 予約システムっていうのは、意外と機能がたくさんある。例えば表示も、カレンダーによる秋質状況の表示、特定の日付を指定すると各部屋の空き室状態が表示されるようなページ、顧客の個人情報ページ(予約状況とか)などが必要だろうし、それぞれのところで予約やキャンセルができないといけない。また最近はホテルでさまざまなプランを用意するのが一般的だから、「どのプランで予約するか」というようなことも必要だし、予約の内容(宿泊客数、食事の有無、ベッドや幼児用ベッドや毛布の有無など)も細かになってきている。そうしたことを考えると、なるべくテーブルを細分化し、修正が入っても一部のテーブルだけ修正するだけですぐに対応できるような形が望ましいと思う。 例えば、上記の4テーブルに、更に「プランテーブル」「詳細情報テーブル」とかを用意し、それぞれに予約番号を保管して整理するようにするとか。詳細情報テーブルには、プランの番号、宿泊客数、食事など細かな項目を用意しておく。プランが追加されればプランテーブルに新たにレコードを登録して対応できるし、必要な情報が追加になれば、詳細情報テーブルだけを修正して対応できるだろうし。(まあ、今、思いつきで書いてるからそこまで分けたほうがいいか、もう少しテーブルを統合したほうがいいかかは詰めて考えないとなんともいえないが) まずは、必要な情報をすべて洗い出し、それらを整理して、なるべく細かなグループわけをしてまとめる。それで、必要なテーブルの構成が見えてくると思う。ま、参考程度に。

dcx147
質問者

お礼

お返事ありがとうございます。 このように実例を基に詳しくご説明頂けますと非常に参考になります。 やはり日付を格納するテーブルは必要ですか・・・ となると曜日のフィールドもセットで組んだ方がいいですね。せめて1年分の日付だけでもcsvで 自動出力してくれるようなものがあればインポートするだけなので作業もだいぶ軽減できるのですが 地味な作業が続きそうですね^^; 言われてみて気づきましたがプラン等機能に応じてテーブルまたはフィールが増えるのは必然ですね。 基本的にはテーブルを分散化して紐づくidを参照しデータの取得を想定していますが確かに正確な機能リストを 練るべきですね。 おかげ様でだいぶイメージがつかめました。ありがとうございます。

関連するQ&A

  • phpMyAdminでページが表示できない

    redhat9にphp4.2.2とMySQL4.0.27をインストールして、phpMyAdminを入れたところphpMyAdminにログインして、データベース、各テーブル、各テーブルの構造等は表示できるのですが、テーブルのデータを表示しようとすると、「ページを表示できません。」となります。 解決法はありますでしょうか。。

    • ベストアンサー
    • MySQL
  • アクセスログテーブルの構造について

    このジャンルでお願いします。 よくアクセスログの解析を無料で(リンクを貼ったりして)行ってくれるサービスがありますが、 そのデータベースの構造というかテーブルの構造はどのようになっているのでしょうか? 例えば、膨大なレコード数になると思うので それを利用するユーザー毎にテーブルを分けるとかするのでしょうか? あるいはユーザー毎、年毎、月毎、日毎、に分けるとか? 本来ならテーブルを分割したりするのは違うんじゃないかなぁと思ったりするのですが、 なので次のように、 CREATE TABLE `accesslog` ( `id` int NOT NULL auto_increment, `user_id` varchar(16), `created` datetime, `ip` varchar(64), FOREIGN KEY(`user_id`) REFERENCES `user`(`id`) ); ユーザーも全ての期間のデータも1つのテーブルで管理するのが普通だとは思うのですが、 アクセスログだけは利用するユーザー数にもよりますがやはり膨大になりますよね? そうすると1つのテーブルだと無理があると思うのです。 あるいは単にテキストファイルとして保存する方法もあるのかな?と思うのですが、 やはりなにかとSQLで操作したいのでMySQLなどのテーブルの設計が知りたいです。

  • PHP、MySQLのUpdateで数式の答えをそれぞれのセルに挿入

    こんにちは。PHPの初心者です。PHP内でのMySQL Updateの使い方で苦労しています。 table02に4つのフィールドがあります。このうちで使うのは「num」と「percent」です。結局、numにあるセルの数を一定数($total_num_rows)で割って100を掛けたいのですが。 $sql = "SELECT * FROM $table02"; $result = mysql_query($sql,$my_sql_connection) or die(mysql_error()); WHILE ($row = mysql_fetch_array($result)) { $num = $row["num"]; $percent = $num/$total_num_rows*100; $update_percent = "UPDATE $table02 SET percent = '$percent'"; $update_result = mysql_query($update_percent,$my_sql_connection); $percentをprintとすると、それぞれの行に適した数字が数式に従って表示されます。でも結局テーブル上では同じ数字が「percent」のフィールド下のセルに挿入されてしまいます。どうやったらそれぞれのセルにprintで表示されるような正しい数字を挿入することができるでしょうか? どうぞ宜しくお願いします。

    • 締切済み
    • PHP
  • PHP+MySQLでこのようなシステム

    PHPとMySQLで、このようなシステムを作れないかと考えているのですが、可能か不可能か、もしくはヒントだけでもいただだけないかと思い、質問させていただきました。 まず、PHP+MySQLというのは、javascriptとかも初心者用の本を買ったりしたのですが、こういうところに使うとかいまいち理解できず、 現在PHP+MySQLと必要な時だけjavascriptのサンプルをコピペとかで使って事足りているということです。 PHP+MySQLの知識は、浅い方ですが、データベースを使っての表示や条件抽出くらいはできるくらいです。 主に使うデータベース・ページは、下記の通りです。 データベース内にテーブルが複数あります。 ・table_01 ・table_02 ・table_03 全テーブルデータの一覧を表示させるPHP(1ページ20件毎に表示させています) ・itiran.php 各会員ページのPHP ・mypage.php 「このようなシステム」というのは、 ・一覧ページ【itiran.php】に[追加]ボタンを作り、[追加]を押すと会員ページ【mypage.php】に追加した商品が一覧として表示される ・【itiran.php】および【mypage.php】で追加した商品を一覧から[削除]できる ・【itiran.php】の各商品には、追加している人数[登録数]が表示される([削除]した場合は、人数は-1となる) 【itiran.php】テーブル例 ┼───┼───┼───────┼───┼ │NAME│ZAIKO│お気に入り    │登録数│ ┼───┼───┼───────┼───┼ │ポニョ │2,000 │ 追加       │500 │ ┼───┼───┼───────┼───┼ │ゲド  │1,000 │ 追加       │300 │ ┼───┼───┼───────┼───┼ │トトロ │9,000  │登録済み・・削除│100 │ ┼───┼───┼───────┼───┼ ・データベースは、各テーブル更新があった場合、一度の更新数が多くいので、1テーブルまるごとCSVで更新しています。 ・登録数を、このテーブル内に入れておいた方が良いのでしょうか。 参考になるようなサイトもなく、PHP+MySQL可能か不可能か、もしくはヒントだけでもお願い致します。

    • ベストアンサー
    • PHP
  • 自身の結果に自身で検索?

    php+mysqlにてある予約システムを作っている者です。 mysqlのクエリ作成で行き詰ってしまったので、ご質問させていただきます。 予約テーブルにはカラムid(key)、roomID(部屋番号),startTime(予約開始日時)、endTime(予約終了日時)があります。 部屋テーブルにはカラムid(部屋番号)、部屋名等があります。 実現したいのは、予約日時が被っている部屋id、予約テーブルのidの抽出(重複した予約)です。 一覧画面にて、予約に対して重複があるかないかを表示したいです。 予約テーブルのstartTimeが他の予約開始日時から予約終了日時までの間になければ、 重複予約はないということになると考えています。 しかし行き詰ってしまった原因は、検索対象がない??ことです。 仮に開始時間だけでもWHERE句に入れられれば、 $検索対象予約開始日時 BETWEEN startTime AND endTime で検索できそうだと想像つくのですが、 その検索対象開始日時は予約テーブル内全部の予約開始日時なのです。 単純に考えると、予約テーブルのidとstartTimeを1件ずつ取得し、全件をBETWEENで検索ループなのでしょうが、 なんとかSQL1文で済ませられないかと思い、質問させていただきました。 疑問点が伝わるか不安な文章で大変申し訳ありませんが、お知恵をお貸しください。

    • ベストアンサー
    • MySQL
  • 教えてください。

    PHP5 Mysql5 で 下記のような状況でPHPの書き方教えてください テーブル構造が id(主キー) uid price 1       26  18000 2       26  12000 3       54  10000 4       54  13000 のような構造で uid 26 のみの price の合計値を求めたい場合 どうすればいいか教えてください。

    • 締切済み
    • PHP
  • php上でSQL文を実行した結果と、phpMyAdminで実行した結果が違う

    ☆実行環境 php5.3 MySQL4.0 $sql="SELECT * FROM テーブル名 WHERE フィールド名 like '".$変数."%'" php上で上記のようなSQL文を実行させようとしています。 テーブルには該当する行がいくつかあるのですが、ページ上では1行も表示してくれません。 mysql_num_rowsの返り値を見ると0になっています。 SQL文の組み立てがおかしいのかと思い、phpMyAdmin上でSQL文を実行すると、 きちんと欲しい内容が表示されます。 とするとphpでのSQL文の書き方がおかしいのだと思います。 どこかおかしいのかご教授ください。

    • ベストアンサー
    • PHP
  • テーブルの結合について

    野球のスコア表を付けようと考えています。 scoreというテーブルにスコアを、 teamというテーブルにチーム名(team_idとteam_name)を入れています。 scoreテーブルには一行でホームチームのidとスコア、ビジターチームのidとスコアを入れています。 そして、そのidとteamテーブルにあるidとを結合しています。 しかし、PHPで読み込む際に(おそらく行の先頭に近いからという理由で)ビジターチームだけを読み込んでしまい、たとえば「横浜対横浜」のような形になってしまいます。 PHPでもう一回ホームチームだけを読み込むようにプログラムすれば問題なく表示はできるのですが、効率が悪いように感じます。 そこで、一回でホームチームとビジターチームの両方を読み込む方法をご教示賜りたく質問させていただきました。 テーブルの構造が悪いと思うのでMySQLの方に投稿させていただきましたが、PHPで可能であればそちらでもかまいません。 よろしくお願いします。 Apache 1.3.34 PHP 4.3.11 MySQL 4.0.26

    • ベストアンサー
    • MySQL
  • テーブルのレコード数を取得したいのですが、返り値が1になってしまいます。

    最近MySQLやPHPを触り始めたものです。マニュアルを参考に、テーブルのレコード数を取得しようとしてみたのですが、返り値が1になってしまいます。なぜこのような結果になるのでしょうか? http://jp.php.net/manual/ja/function.mysql-num-rows.php : : $db = mysql_connect($db_host,$db_user,$db_password); mysql_select_db($db_name,$db); $count = mysql_query("select count(*) from $db_table", $db); $num_rows = mysql_num_rows($count); echo "<p>{$num_rows}</p>"; どこに問題があるのかわかりません……。初歩的なミスをしているのだと思うのですが、数時間このままの状態で困っています。

    • ベストアンサー
    • PHP
  • PHPカレンダー

    PHP,MySQL,Apacheを使って予約システムをつくっています。 PHPでカレンダーを表示する場合、 3ヶ月分が常に自動表示され、過ぎた日には自動で "-"が引かれようにするにはどうすればいいですか? また日にちをクリックしてその日にちの値を取得できるようにするにはどうすればよいですか? まだまだ勉強不足の未熟者ですが誰か教えてください。

    • 締切済み
    • PHP

専門家に質問してみよう