• 締切済み

DB設計についてアドバイスお願いします。

作成するアプリケーションは簡単なスケジュール管理のできるWEBアプリケーションです。 以下、作成予定のテーブルです。 <tbl_date> id VARCHAR(50) ・・・PRIMARYKEY / not null / AUTO INCREMENT date VARCHAR(8) ・・・not null <tbl_schedule> id VARCHAR(50) ・・・PRIMARYKEY 、not null 、AUTO INCREMENT morning VARCHAR(50) afternoon VARCHAR(50) evening VARCHAR(50) 以下、ページ詳細です。ユーザー側と管理側に分けています。 <ユーザー側> 1ページ目 ⇒はじめのページで日付を選択する。プルダウンメニューで日付を選択してsubmitボタンを押すと選択された日付がDBに登録され、次の画面に遷移する。 2ページ目 ⇒登録されているスケジュールをDBから呼び出して表示する。 <管理側> 1ページ目 ⇒はじめのページで日付を選択する ※ユーザー側とは別のページ 2ページ目 ⇒スケジュールの編集画面。テキストフォームと登録されているスケジュールをDBから呼び出して表示する。 DB設計は初挑戦なので見当違いなところ多くあると思います... ご指摘、アドバイス等いただけたらと思います。よろしくお願いいたします。

  • Java
  • 回答数2
  • ありがとう数1

みんなの回答

  • shiren2
  • ベストアンサー率47% (139/295)
回答No.2

期限が明日とのことですが、具体的には何が問題なのでしょう? テーブル設計は特に問題ないと思います。 後はクエリの飛ばし方か、CGIがわからないかでしょうか。 CGIの処理はこんな感じです。 <表示側> 1) 日付を選択してSUBMIT 2) SELECT文で日付の一致するデータがあれば持ってくる <管理側> 1) 日付を選択してSUBMIT 2) 管理画面を表示して、各メッセージを入力させる。SELECT文で日付の一致するデータがあれば初期入力しておく。入力後、再度SUBMIT 3) 日付が存在しなければINSERT文で挿入、日付が存在すればUPDATE文で更新 4) 完了メッセージを表示

回答No.1

>id VARCHAR(50) ・・・PRIMARYKEY / not null / AUTO INCREMENT PRIMARY KEY制約は、UNIQUE制約とNOT NULL制約を持つので、NOT NULLは不要です。AUTO INCREMENTを使用する場合、データ型は数値型を指定すると思います。詳しくはDBのリファレンスでご確認ください。 >date VARCHAR(8) ・・・not null 「date」は日付型のキーワードですので使えないと思います。「due_date」に直した方がいいと思います。また、VARCHAR(8)は使用せず日付型を使用するべきです。 >以下、ページ詳細です。ユーザ側と管理側に分けています。 シングルユーザならばテーブルは単純に1つにしたほうが簡単になりますよ。 <tbl_schedule> due_date DATE primary key morning VARCHAR(50) afternoon VARCHAR(50) evening VARCHAR(50) また、<ユーザ側>→<表示処理>、<管理側>→<編集処理>と文言を直した方がいいでしょう。 学校の課題制作かなんかだと思いますが、勉強不足を感じます。テキストを読み返す、テキストの分からないところを教師や先輩などに相談するなどして、基礎知識をしっかり身に付けた方がいいですよ。

yuka35896
質問者

補足

OrangeCup150さん 詳しい回答ありがとうございます。確かに勉強不足を感じました。この課題の期限が明日までなため、これが終ったあとでじっくり勉強していくつもりです。 >シングルユーザならばテーブルは単純に1つにしたほうが簡単になりますよ。 2つのテーブルを連結させることが今回の課題目的なため2つのテーブルで作成しています。 実際はtbl_dateの中身はdue_dateだけではなくてyear、month、dayの3つになる予定です。 はじめは単純に考えようと思ってシンプルな形にしました。ご回答いただいたのに説明不足でして申し訳ありません。 >また、<ユーザ側>→<表示処理>、<管理側>→<編集処理>と文言を直した方がいいでしょう。 ありがとうございます。たしかにそちらのほうがぐっとシンプルでわかりやすくなりますね! 以下にもう少しわかりやすく、詳しく書き直してみました。もしよろしければアドバイスお願いいたします。 ============================================ <ユーザ側>→<表示処理> 1.ユーザー側indexページで日付を選択してサブミットボタンを押すと表示処理ページに遷移。 2.表示処理ページでは前ページで選択された日付を判断し、morning、evening、afternoonのデータが呼び出される。ユーザーは指定した日のスケジュールを確認できる。 <管理側>→<編集処理> 1.管理側indexページで日付を選択してサブミットボタンを押すと編集処理ページに遷移。 2.編集処理ページでは前ページで選択された日付を判断し、morning、evening、afternoonのデータの入ったテキストフォームが呼び出される。ユーザーは自分のスケジュールを編集できる。 3.テキストフォームを編集して登録ボタンを押すとtbl_scheduleのデータが更新される。『登録が完了されました』というテキストが表示される登録完了ページ遷移される。 ============================================== =内の形にしたいのですが自分の作成したDB設計では実現ができませんでした…。 もうあまり時間がないため回答をいただきたいのですが、2つのテーブルを連結させて実現する場合、どのようにDBを設計すればよろしいでしょうか。 また、お時間があるようでしたら日付を判別させる部分についてのアドバイスをお願いいたします。 今のところ下記の方法で考えています。 ・日付を選択した時点でtbl_dateテーブルを作成して自動生成idと選択された日付の値がdue_dateに代入される ↓ ・画面遷移先でtbl_scheduleのidを参照してmorning、evening、afternoonのデータを表示させる。 ※これはユーザー側indexページと管理側indexページのどちらのページに設定するべきなのか… また、どちらかに設定した場合、設定されなかったページにはどのような設定をすればよいのか…。 どうか解決策を持っている方、是非、ご回答の程よろしくお願いいたします。

関連するQ&A

  • DBのデータを表示させたい

    こんにちは PHPは今まで他人様の作成したスクリプトをそのまま使用したりちょこっと改造するだけでしたが、 現在必要としているスクリプトが探してもなさそうなので 自分で作成しようと決めて勉強を始めましたが どうしても悩んでいる部分があるのでご教授いただけると助かります。 環境は以下の通りです apache 1.3.37 PHP 5.25 MySQL 5.0 現在の状況なのですが `uid` mediumint(8) NOT NULL auto_increment, `user` varchar(25) NOT NULL, `pass` varchar(32) NOT NULL, `place` varchar(32), `sev` varchar(32), `date` varchar(25) NOT NULL, `regdate` datetime, `gate` varchar(25), `statue` varchar(25), PRIMARY KEY (`uid`), KEY `user` (`user`), KEY `date` (`date`), KEY `gate` (`gate`), KEY `statue` (`statue`) このようなテーブルが作成してありユーザーがフォームから登録したものをDBに保存していき、 1ページに数件分ずつの表示で何ページにもわたって 全件を表示するようなページをです。 フォームからDBへのデータの保存はできるようになりましたが 表示をする際に何件もの表示をするのにどういった手法で行うのがいいのかで悩んでいます。 現在は最新の1件だけ表示されるようなページになっています。 <?php include ("config.php"); $con = mysql_connect($dbhost, $dbuser, $dbpasswd); $selectdb = mysql_select_db($dbname, $con); $sql = "SELECT * FROM testdata ORDER BY regdate DESC"; $rst = mysql_query($sql, $con); $datanum = mysql_num_rows($rst); if ($datanum < 1) { print("データがありません。<br>\n"); print("登録は <a href=\"regist.php\">こちら</a> から"); mysql_close($con); exit; } $data = mysql_fetch_array($rst) ?> <table width="95%" border="0" cellspacing="1"> <tr> <td><table width="100%" border="0"> <tr <td colspan="6">登録情報</td> </tr> <tr> <td width="13%">登録者名</td> <td width="20%"> <?=$data['user']?> </td> <td width="13%">場所</td> <td width="20%"> <?=$data['place']?> </td> <td width="13%">サーバー</td> <td width="20%"> <?=$data['sev']?> </td> </tr> <tr> <td>登録日時</td> <td> <?=$data['regdate']?> </td> <td>日時</td> <td> <?=$data['date']?> </td> <td colspan="2">&nbsp;</td> </tr> </table></td> </tr> <tr> <td><table width="100%" border="0"> <tr> <td colspan="5">状態</td> </tr> <tr> <td width="16%">ゲート</td> <td width="30%"><?=$data['gate']?></td> <td>&nbsp;</td> <td width="16%">statue</td> <td width="30%"><?=$data['statue']?></td> </tr> </table></td> </tr> </table> DBから何件分もの表示をするにはDBのデータを連想配列にするのかなと思っているのですが いまいちどんな手法が良いのかわかりません。よろしければご教授くださいませ。

    • ベストアンサー
    • PHP
  • MySQLのテーブル設計で迷っています(桁数)

    MySQLのテーブル設計で迷っています。 クリエイト文のカッコの中は桁数を表しているのでしょうか?それともバイト数でしょうか?桁数であれば、それぞれの型で何桁まで設定できますでしょうか? int型のnoを18桁に変更したいのですが、調べているうちに迷ってしまいました。 型 バイト 最小値 最大値 TINYINT 1 -128 127 SMALLINT 2 -32768 32767 MEDIUMINT 3 -8388608 8388607 INT 4 -2147483648 2147483647 BIGINT 8 -9223372036854775808 9223372036854775807 CREATE TABLE `user` ( `no` int(8) unsigned NOT NULL auto_increment, `id` varchar(24) NOT NULL default '', `email` varchar(255) NOT NULL default '', `reg_date` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`no`) ) TYPE=MyISAM;

    • ベストアンサー
    • MySQL
  • 2つのテーブルを連結させる方法

    スケジュール管理のできるWEBアプリケーションを作成しようと考えています。 下記構成において、2つのテーブルを連結させるクエリの書き方について教えて頂きたいです。 よろしくお願いします。 ▼DB内容 CREATE TABLE a ( id int primary key autoincrement, year varchar(4), month varchar(2), day varchar(2) ); CREATE TABLE b ( id int (※aテーブルとidで連結させたい) sche1 varchar(10), sche2 varchar(10), sche3 varchar(10), ) ・a +--+----+-----+---+-----+ | id | year | month | day | week | +--+----+-----+---+-----+ | 1 | 2010 | 11 | 20 | 土 | | 2 | 2010 | 11 | 21 | 日 | | 3 | 2010 | 11 | 22 | 月 | | 4 | 2010 | 11 | 23 | 火 | | 5 | 2010 | 11 | 24 | 水 | | 6 | 2010 | 11 | 25 | 木 | | 7 | 2010 | 11 | 26 | 金 | | 8 | 2010 | 11 | 27 | 土 | | 9 | 2010 | 11 | 28 | 日 | | 10 | 2010 | 11 | 29 | 月 | +--+----+-----+---+-----+ ・b +--+-----+------+ | id | sche1| sche2 | +--+-----+------+ | 1 | 空き | 空き | | 2 | 空き | 空き | | 3 | 仕事 | 空き | | 4 | 仕事 | 空き | | 5 | 仕事 | 空き | | 6 | 仕事 | 空き | | 7 | 仕事 | 空き | | 8 | 空き | 空き | | 9 | 空き | 空き | | 10 | 仕事 | 空き | +--+-----+------+ ▼ページ内容 <ユーザ側>日付選択画面 ・calendar.jsp +----------------------+ | << 2010 11月 >> | 日 月 火 水 木 金 土 | ___ _1 _2 _3 _4 _5 _6 | _7 _8 _9 10 11 12 13 | 14 15 16 17 18 19 20 | 21 22 23 24 25 26 27 | 28 29 30 +----------------------+ <ユーザ側>表示処理画面 ・sche.jsp +----------------------+ |2010 11 23 火 のスケジュール | |sch1 仕事 |sch2 空き | +----------------------+ <管理側>日付選択画面 ・m_calendar.jsp +----------------------+ | << 2010 11月 >> | 日 月 火 水 木 金 土 | ___ _1 _2 _3 _4 _5 _6 | _7 _8 _9 10 11 12 13 | 14 15 16 17 18 19 20 | 21 22 23 24 25 26 27 | 28 29 30 +----------------------+ <管理側>編集処理画面 ・m_sche.jsp +---------------------------+ |2010 11 23 火 のスケジュール | |sche1 | +--+-----+ | | ▼ | 仕事 | ※←プルダウンメニュー | +--+-----+ | |sche2 | +--+----+ | | ▼ | 空き | | +--+----+ | | | [登録ボタン] | +------------------+ ※ユーザ側の閲覧は携帯端末を考えてます。 ※値の保持や呼び出しは全てDBで管理しようと思います。 ※使用しているのはMySQL5.1です。

    • ベストアンサー
    • MySQL
  • DB設計について

    ユーザー情報などで、チェックボックスで複数選択してもらった項目を DBへ登録する場合どのように、テーブルを作るのが良いのでしょうか? 例えば、一つのフィールドに、選択してもらった項目を user_id hoby 1    'サッカー,野球,バスケ' などと入れるのがいいのか、 別の、テーブルを作って、 user_id hoby 1    サッカー 1    野球 1    バスケ この方がよいのか、どちらがよいのでしょうか、よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • varchar型を主キーに…

    現在サーブレット/JSPを利用してDBにユーザアカウントを登録、削除、更新、一覧をできるようするシステムを作成しています。 テーブルを create table loginuser ( userId char(16) not null default '', passwd char(16) not null default '', name varchar(50) not null default '', accessFlg int(1) not null default '0', primary key(userId)); で作成しました。 IDが数字の時はDBに登録ができるのですがIDに文字を入力するとDBに登録されません。 主キーをvarchar型で使用するのは不可能なのでしょうか? ご返答をよろしくお願いします。

  • 投稿サイトをサクッと作りたい

    http://webeg.info/php-course/step3-030/のログイン画面をログインして、投稿サイトを作りたいのですが、 ログイン情報はどこで定義してなんというものになっているのでしょうか? 空にして もログインできません。 投稿部分だけが欲しいのですが、ログインしないと作れないようです。 もちろんもっと簡単に投稿サイトが作れる情報があればそれでも構いません。 CREATE TABLE `users` ( `user_id` int(11) NOT NULL COMMENT '通しID', `user_loginid` varchar(20) NOT NULL COMMENT 'ログインID', `user_password` varchar(100) NOT NULL COMMENT 'パスワード', `user_updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新日時', `user_created` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '作成日時' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='管理画面ユーザー'; ALTER TABLE `users` ADD PRIMARY KEY (`user_id`); ALTER TABLE `users` MODIFY `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '通しID', AUTO_INCREMENT=1; アカウントの追加 を実行しただけなのでPW、IDは空と考えてよいでしょうか? パスワードの所には長さ100とコメントパスワードとしか記載がないのですがdbではどこにpwを入れるのですか? この場合は空と考えるべきでしょうか? 投稿サイトをサクッと作りたいだけなのですが、もっと簡単に作る方法はないのでしょうか?

    • ベストアンサー
    • MySQL
  • NOTNULL制約について

    MYSQL ver4.0.20a 下記のようにNOTNULL制約を付けてテーブルを作成するのですが、 デフォルト値が勝手に設定されてしまいます。 CREATE TABLE TEST_01 ( NO int(8) NOT NULL auto_increment, STATUS int(1) NOT NULL, TOUROKUBI date NOT NULL, MEMO varchar(200) NOT NULL, PRIMARY KEY (NO) INT型だと 0 varchar型だと '' date型だと 0000-00-00 インサートの時に値がNULLの場合、SQLエラーを返してほしいのですが、 デフォルト値が設定されている為、登録されてしまいます。 本当はNOTNULL制約で、DBにチェックを任せたいのですが・・・ どなたかご存知の方、教えてください。 お願いします。

    • ベストアンサー
    • MySQL
  • データベースを作成するプロシージャ

    Webで動作するシステムをユーザー単位でDBを作成し、管理しようと思うのですが、(1)DBを作成するプロシージャというものは作成できるのでしょうか? (2)というかそのようなWebシステムを作成したい場合、1ユーザーにつき1DBという管理方法で正しいのでしょうか? (3)1ユーザーにつき1DBの場合、MYSQLのDBはMY.INIで設定されたメモリを超えない範囲ならいくつでもDBを作成できるのでしょうか? (4)そして作成するプロシージャを作成する場合、以下のような感じでINパラメータのusernameをプレフィックス「DB_」の後ろにつけて作成しようと思うのですが、その場合パラメータをDB_の後ろに連結するにはどのように記述したらよいのでしょう? userkanridb:ユーザを管理しているメインのDB。ここにプロシージャを作成しようと思っています。 DELIMITER $$ DROP PROCEDURE IF EXISTS `userkanridb`.`newDB` $$ CREATE PROCEDURE `userkanridb`.`newDB` (in username integer(8)) BEGIN DROP TABLE IF EXISTS `DB_`.`mConfig`; CREATE TABLE `DB_`.`mCconfig` ( `shime` int(2) NOT NULL, `usernm` varchar(20) NOT NULL, `style` tinyint(1) NOT NULL, `message` varchar(20) default NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; END $$ DELIMITER ; ご伝授御願いします。 MySQLのバージョン:MYSQL5.0.51

    • ベストアンサー
    • MySQL
  • DB内 データ表示

    DBに登録されているスケジュールの表示方法についてご質問があります。 以前にもご質問させていただいのですが、時間がたってしまったため、再度ご質問させていただきます。 DBはMysqlを使用しています。 例 1 | 2010年12月26日(日) | テスト | テスト | テスト 2 | 2011年01月07日(日) | テスト2 | テスト2 | テスト2 3 | 2011年01月13日(土) | テスト3 | テスト3 | テスト3 4 | 2011年01月14日(日) | テスト4 | テスト4 | テスト4 上記のようにDB内にスケジュールがあるとします。 この中から今日の日にちより一番近いスケジュールを一件だけ表示させたいのですが方法がわからず困っています。 本日が12月27日であれば1月7日のスケジュールのみを取得。 本日が1月7日であれば1月13日のスケジュールのみを取得。 日付はvarchar型にて登録しています。 日程は不定期に入ります。 このように表示させるにどのように記述したらよろしいのでしょうか? お分かりの方がいらっしゃいましたらご教授お願いいたします。 また、お手数で御座いますが、コードの書き方も教えていただければと思います。

    • ベストアンサー
    • PHP
  • VBAでDBから取得したデータを突き合わせる

    VBAでOracleに接続し、取得したレコードを突き合せようとしています。 2つのテーブル(TBL_A、TBL_B)からレコードを1件ずつ取得し、 それぞれのレコードの項目を突き合わせて一致しているかを確認します。 2つのテーブルは以下のような状態です。 【TBL_A】 社員番号,SYAIN_NO,VARCHAR2(10) 社員名 ,SYAIN_NM,VARCHAR2(50) 【TBL_B】 社員番号,SYAIN_NO,VARCHAR2(10) 社員名 ,SYAIN_NM,VARCHAR2(50) レコードを取得する際、 以下のようなユーザ定義型変数に値を設定しています。 Dim TBL_A_REC As SYAIN Dim TBL_B_REC As SYAIN Type SYAIN SYAIN_NO As String SYAIN_NM As String End Type 今後、各テーブルに生年月日のカラム(BIRTH)を追加する可能性があり、生年月日も突き合わせたいです。 先日、こちらで質問してユーザ定義型変数を動的に増やすことは不可能であるとご回答を頂きました。 ユーザ定義型変数を用いずにDBから取得した値を設定し、 突き合わせを行う良い方法はあるのでしょうか?

専門家に質問してみよう