Apache/2.0.52 (Win32) PHP/5.0.3 MySQL/4.0.14と言った環境で画像掲示板を作成しています。
サイトの構造は
-top
--asia
---japan
----hokkaido(掲示板)
----tohoku(掲示板)
---korea(掲示板)
--oceania
---australia
----queensland(掲示板)以下続く
と言ったように相当な数のディレクトリが存在し、その各最下層に掲示板のページがあるといった状況です。
掲示板のログをデータベース形式で保持し、記事や画像、ページに対して高速に検索したり、新着記事の表示をできるようにしようと思っています。

現在データーベースのフィールドは以下のように構成してます。
no______int(pri)_記事ナンバー
resno___int______レスナンバー
regtim__datetime_登録日
name____varchar__ニックネーム 
title___varchar__タイトル
com_____text_____コメント
host____varchar__ホスト
ext_____varchar__画像の拡張子
pass____varchar__記事編集削除用パス
fname___varchar__画像のファイル名

同じフィールド構造を持つテーブルを、テーブル名:hokkaido , tohoku , queesland 等として所持してます。が、同じフィールドの構造であればそれらすべてを一つのテーブルにまとめてしまったほうが管理が楽であったり検索が高速なような気がして no 記事ナンバーの前に dir varhcar ディレクトリ名(ディレクトリのURL) を購入してDBを構築したほうが良いパフォーマンスが得れるような気もしますが、同じ値が dir フィールドに列挙されるのもおかしい気がします(一つのページ、ディレクトリに対して保存される記事数は1000件です)。

データベースを扱うこと自体始めてでオーソドックスなテーブル、フィールドの構造(スキーマって言うんですか?)の立て方が分からず困ってます。どなたかアドバイスまたは参考URLなど教えていただけないでしょうか・・・

このQ&Aに関連する最新のQ&A

A 回答 (1件)

このような構造ではいかがですか?


T:table
P:primary
F:Field
I:index

(1)掲示板集合に関する地域マスター情報
T.areamaster
|--F.areaid(P)
|--F.arename(I)

(2)掲示板そのもの
T.bbs
|--F.areaid(PI)
|--以下設定された情報で
no______int(pri)_記事ナンバー
resno___int______レスナンバー
regtim__datetime_登録日
name____varchar__ニックネーム 
title___varchar__タイトル
com_____text_____コメント
host____varchar__ホスト
ext_____varchar__画像の拡張子
pass____varchar__記事編集削除用パス
fname___varchar__画像のファイル名

現在の、
>相当な数のディレクトリが存在し
という部分の数がわかりませんが、1掲示板の上限が1000レコードとするなら、
最大50個の掲示板と仮定し、すべて埋まっても50000レコードですから、 
これならmySQLの範疇だと思います。ポイントはareaidをkey&indexにしないと、
地域ごとに WHERE areaid = $_POST['areacode']で抽出した時に、
期待したパフォーマンスが得られないと思います。

正規化は実際のアクセスも考えながら行ったほうが良いので、これがベストとは
断言はしませんが、現在のようにテーブルを分けるとプログラムも分散するので、
よろしいくないかと思います。

また、プログラムは地域のidを基準にGET要求で開く形式だと、
地域のマスターを追加するだけで柔軟に対応できるかと。

この回答への補足

ポイントの発行の仕方と良回答ってつけるやり方がわからないのですが・・・

補足日時:2005/04/12 02:36
    • good
    • 0
この回答へのお礼

レスありがとうございます。
とりあえず"地域ごとにテーブルを分けるのはよろしくない"と言うことですね。
自分まだ初心者でshige1127さんの言ってることの半分も理解できてないのですがshigeさんの親切丁寧なレスに俄然やるきでてきました!

追加の質問で申し訳ないのですが
areaidには実際どのような値をどのデータ型で入れれば良いのでしょうか?
areanameは"hokkaido"とか"northisland"とかでよろしいんですよね?

Tabel-bbsのFieldは
areaid(PI)
no______int(pri)_記事ナンバー
resno___int______レスナンバー
regtim__datetime_登録日
name____varchar__ニックネーム 
title___varchar__タイトル
com_____text_____コメント
host____varchar__ホスト
ext_____varchar__画像の拡張子
pass____varchar__記事編集削除用パス
fname___varchar__画像のファイル名
のようにprimaryをareaidとnoにつけてよろしいのですか?

自分でも色々webサイト検索して勉強していくつもりですがよろしければ初心者でも分かりやすいようなお勧めのサイトなど教えてもらえると助かります。

よろしくお願いします。

お礼日時:2005/04/12 02:28

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q掲示板用のDB設計

PHPとMySQLを組み合わせた掲示板を作成しています。

ただ単にデータを挿入し、投稿日が新しい順に表示するだけではなく、各投稿に対して投稿、返信が出来る掲示板のDB設計に悩んでいます。
(一般的に言う ツリー型 です。)

各レコードにIDを割り振り、あるレコードに対し返信すると、そのレコードのIDが返信レコードに割り振られます。
ただ、この場合、返信に対する返信に元のレコードのIDを割り振ることは出来ず、困っています。

また、ツリー式の掲示板はどのようにしてデータをツリー形式で最新順にSELECTしているのでしょうか?

Aベストアンサー

#1回答者です。

たぶん、MySQLのauto_incrementに頼りきりというか、「IDは自動採番(MySQLなら、auto_increment)するもの」という固定観念でテーブル設計しているのではないかと勝手に推察しています。
RDBMSの自動採番を使うのはケース・バイ・ケースであるし、行を一意に識別でき、コード体系に殆ど変更の可能性がないなら、自動採番を積極的に使う必要はありません。
また、自動採番するにせよ、独自にIDを作るにせよ、その情報を「返信」を管理するテーブルに持てばいいだけの話であって、この辺はテーブル設計の話です。

現状、「どういうテーブル設計」、「どういうSQLによる操作」を考えていて、この方式では、「xxといった問題が生じる」といった具体的な質問をしてもらえなければ、他人には具体的なアドバイスをするのは無理なのです。

QJava、HTMLを使って、BBSをつくるには・・・・

質問の通り、Java、HTMLを使って、BBSをつくりたいです。
作る環境は大体わかったのですが、そのあとがいまいち・・・
作るための、手順を教えて下さい。
よろしくお願いします。

Aベストアンサー

参考URLに簡単な掲示板のサンプルがあります。

このサイトには環境構築などの手順も書いてあります。

ただ、質問の文面からすると、ここを読んでも理解できないかもしれませんね。
基礎学習から始めた方がいいかも。

参考URL:http://homepage3.nifty.com/uzblend/servlet/index.html#x22

QFORMで送信ボタンと戻るボタンを2つつけてそれぞれ遷移先を変えたい

  
以下のような画面を作りたいのですが↓

--------------------------------------------------------------------------------
● a.php (ユーザ情報入力画面) ※フォームに入力する画面
 
 <FORM method="POST" action="b.php">
  <INPUT type="text" name="mail">
  <INPUT type="submit" name="submit" value="確認">
 </FORM>

● b.php (ユーザ情報入力確認画面)※フォームに入力された値を表示する画面

 <FORM method="POST" action="c.php">
  <!-- ここには、フォームに入力された値を表示する -->
  <INPUT type="submit" name="submit" value="登録"> // c.php に遷移する
  <INPUT type="submit" name="submit" value="戻る"> // a.php に戻る
 </FORM>

● c.php (完了画面)
--------------------------------------------------------------------------------
b.php について質問なのですが、
b.phpにおいて、登録ボタンと戻るボタンを2つつけて、
それぞれ遷移先を変えたいのですが、どうすればいいんでしょうか・・・?
<FORM method="POST" action="c.php">と書いてしまうと、
戻るボタンを押しても戻らずに、c.phpに遷移してしまいますよね??
こういう場合ってJavaScriptとかで遷移先を指定するんですか・・?
もしそうでしたら、JavaScriptがよくわからないので
できればサンプルコード示していただけると助かります・・・。
  

  
以下のような画面を作りたいのですが↓

--------------------------------------------------------------------------------
● a.php (ユーザ情報入力画面) ※フォームに入力する画面
 
 <FORM method="POST" action="b.php">
  <INPUT type="text" name="mail">
  <INPUT type="submit" name="submit" value="確認">
 </FORM>

● b.php (ユーザ情報入力確認画面)※フォームに入力された値を表示する画面

 <FORM method="POST" action="c.php">
  <!-- ここには、フォームに入...続きを読む

Aベストアンサー

はじめまして。

<INPUT type="submit" name="submit" value="登録" onClick="form.action='c.php';return true">
<INPUT type="submit" name="submit" value="戻る" onClick="form.action='a.php';return true">

でいいと思います。(実際、このコードで使っています)
値を渡すには、FORM内にhiddenで、値を設定しておいて、methodをPOSTに設定しておけば、渡せます。

QPHP&MySQLでの文字列+数列の一意の連番を生成するには?

お世話になります。

PHP&MySQLでプログラムを勉強しています。

データを挿入する際にデータに連番を振ろうと思っています。その際に連番を1 2 3 4・・・というような連番ではなく、

hametome0000001
hametome0000002
hametome0000003




といったような(文字列+数列)連番にしたいと思っているのですが、MySQLのデータ型をauto incrementにして連番を振る場合では文字列+数列の連番が振れないようなので、どのようにすれば文字列+数列の連番を振れるのか分かりません。

よろしくご教授のほど、お願いいたします。

Aベストアンサー

トランザクションの問題がありますが

+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id | int(8) | NO | PRI | NULL | auto_increment |
| id_name | varchar(10) | YES | | NULL | |
+---------+-------------+------+-----+---------+----------------+

のようなテーブルで説明しますと
insert into test values (NULL,concat('hogehoge',last_insert_id()+1));
これでいけるかとおもいます。

同一SQL文内で インサート時の id が取れないので
直近で insertされた id + 1 を取得してインサートしています。

下記の解答の様に
insert into test values (NULL,'hogehoge');
とやったあとに
update test set id_name=concat('hogehoge',lpad(last_insert_id(),2,0)) where id = last_insert_id()
でもいいかと思います。

トランザクションの問題がありますが

+---------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+----------------+
| id | int(8) | NO | PRI | NULL | auto_increment |
| id_name | varchar(10) | YES | | NULL | |
+---------+-------------+------+-----+---------+----------------+

のようなテーブルで説明しますと
ins...続きを読む

Qフォームのtextareaにnl2brを使用すると、入力内容の改行部分に
が表示されてしまう。

現在、フォームを作成しています。
セッションを利用してフォームの次のファイルにデータを受け渡しています。

問題は、フォームのtextareaにnl2brを使用すると、出力画面のtextareaに入力された内容において改行がある部分に<br />タグが表示されてしまうことです。

フォームの流れ:
start.phpにおいてフォームに入力及び、入力エラーがある場合、入力内容訂正の表示。
mail.phpにおいて入力内容の確認及びデータ送信。

start.phpのtextarea以下:
<textarea name="test"><?php echo nl2br(htmlspecialchars($input_data['test'], ENT_QUOTES, 'UTF-8')) ?></textarea>
解説:start.phpでは、フォームの入力項目のいずれかに入力エラーがあるとその項目の入力内容の訂正を促し、入力されたデータをもう一度表示します。(<textarea name="test">に入力されたデータをもう一度<textarea name="test">に表示します。)

mail.phpにおいてstart.phpのtextareaに入力されたデータを表示する部分は以下:
<?php echo nl2br(htmlspecialchars($input_data['test'], ENT_QUOTES, 'UTF-8')) ?>

start.phpにおいて入力項目のいずれかにエラーがあり、<textarea name="test">に入力されたデータをもう一度<textarea name="test">に表示した場合も、また、mail.phpにおいてstart.phpのtextareaに入力されたデータを表示した場合も、<textarea name="test">内の文字列に改行があるとその部分に<br />が表示されてしまいます。

入力例:
あいうえおかきくけこ
たちつてと

表示例(nl2br使用):
あいうえおかきくけこ<br />
たちつてと
解説:nl2brを使用した場合、<br />は挿入されてしまいますが、予定の場所で改行されて表示されます。

試しにnl2br()をコードから削除すると、以下のような表示となります。
表示例(nl2br未使用):
あいうえおかきくけこたちつてと
解説:nl2brを使用しない場合、改行されません。

どのようにすれば、textareaに入力された内容の改行部分が改行だけされ<br />が表示されないようにできるでしょうか?

よろしくお願いします。

現在、フォームを作成しています。
セッションを利用してフォームの次のファイルにデータを受け渡しています。

問題は、フォームのtextareaにnl2brを使用すると、出力画面のtextareaに入力された内容において改行がある部分に<br />タグが表示されてしまうことです。

フォームの流れ:
start.phpにおいてフォームに入力及び、入力エラーがある場合、入力内容訂正の表示。
mail.phpにおいて入力内容の確認及びデータ送信。

start.phpのtextarea以下:
<textarea name="test"><?php echo nl2br(htmlspe...続きを読む

Aベストアンサー

nl2brを使用して、<br />を \n とかに戻してやればいいと思います。
$data = nl2br(htmlspecialchars($input_data['test'], ENT_QUOTES, 'UTF-8'));
echo ereg_replace ("<br />","\n",$data);
とかで。

Q宜しくお願いします。

宜しくお願いします。
mix~max値の間、発行したクエリーからの値を配列に入れたいのですが、どうもFor文中にmin,max値は届いているのですが,$resultに値が入りません。
エラーからしてSQLで行っている変数処理に$iの値が届いてない感じがするのですが、下記のソースを見て頂いて、疑わしき点などご指摘、ご教授いただけませんでしょうか。

どうぞ宜しくお願いします。


--エラー文ここから--->
Catchable fatal error: Object of class stdClass could not be converted to string in ...




--ソースここから--->

$min = h($r -> x);
$max = h($s -> y);
for($i=$min ; $i<= $max; $i++){
$search = sprintf("SELECT id FROM Sheet WHERE no='%d'",$i);
$q_search = mysql_query($search);
$result = mysql_fetch_object($q_search);
echo $result;
}

宜しくお願いします。
mix~max値の間、発行したクエリーからの値を配列に入れたいのですが、どうもFor文中にmin,max値は届いているのですが,$resultに値が入りません。
エラーからしてSQLで行っている変数処理に$iの値が届いてない感じがするのですが、下記のソースを見て頂いて、疑わしき点などご指摘、ご教授いただけませんでしょうか。

どうぞ宜しくお願いします。


--エラー文ここから--->
Catchable fatal error: Object of class stdClass could not be converted to string in ...




--ソースここから...続きを読む

Aベストアンサー

PHPあまり詳しくないので間違っていたらすいません。


>$result = mysql_fetch_object($q_search);
でresultはobject型で代入しておりそれを表示するときにString型に変換できていないのが原因かとおもわれます。

参考URL
mysql-query
http://php.net/manual/ja/function.mysql-query.php

mysql-fetch-array
http://php.net/manual/ja/function.mysql-fetch-array.php

mysql_fetch_object
http://phpspot.net/php/man/php/function.mysql-fetch-object.html


人気Q&Aランキング

おすすめ情報