データ格納形式についてお知恵を拝借したいです。

下記URLのような一般的な掲示板ツリー構造を再現するにあたり、最低限どのようなデータを保持している必要がありますか?
http://www.skullysoft.com/soft/ssc-board/bbs/main/c-board.cgi?cmd=ntr;tree=948;id=sample1
再帰的取得ではなくデータベースから一括取得するパターンがなかなかイメージできません。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/04/14 16:30:00
  • 終了:--

回答(4件)

id:typista No.1

typista回答回数359ベストアンサー獲得回数72005/04/14 17:01:37

ポイント20pt

保持するデータの項目ですよね?

 ・スレッドNo.

 ・タイトル

 ・投稿者

 ・日にち

 ・時間

 ・本文

 ・ブラウザ情報

 ・親スレッドNo.

  (親から見た子は複数の場合がありますが、子から見た親は必ず1つ)

で良いと思います。


補足としては、親スレッドNo.がnullなら、その投稿がルートスレッド。親スレッドNo.に複数の子スレッドがぶら下がっている場合は、(子の)スレッドNo.順に表示していくといったところでしょうか。

NEWの新着情報は、表示するサーバ時間と投稿時間を比べれば計算できます。未読表示は、掲示板を見る人(PC)ごとに違うので、クッキーを使うことになるかと。

クッキーは、既読番号のみを保存しておけば、良いかな?


いずれにしても一括取得してから、ロジカルにツリーを組み立てたり、上記の新着時間計算やクッキー操作は必要になるかと思います。


こんな説明で良いのでしょうか?

id:nakeyouguisu

親スレッドナンバーだけですと、自信の階層情報はわかりませんし、そのスレッドの中のどの記事についた返信かも判断しかねます。

2005/04/15 14:23:37
id:shampoohat No.2

shampoohat回答回数347ベストアンサー獲得回数02005/04/14 19:03:13

ポイント20pt

データベースから、複数行を一括でよめば、あとはいったんDBから読み込んだデータから、再起的に取得すればふつうにオーケーになります。


こつとして、1画面に表示するための目印にする情報をレコード(発言)に加えると良いです。

この目印にするための情報としては、根っこに相当する発言のIDとかが挙げられます。


なので、


- ツリーのID // 根っこに相当する発言のID

// 最悪、なくてもいい

- 発言(タイトル、内容、日付、発言した人など)

- 発言のID

- 直前の発言(親)のID


があれば良いです。

id:nakeyouguisu

親記事番号を取得して、その記事番号を元にその記事番号を親に持つ記事番号を取得して・・・の繰り返しをやればたしかにできるかとは思いますが・・・

煩雑すぎませんかね?

2005/04/15 14:25:48
id:dev_zer0 No.3

dev_zer0回答回数332ベストアンサー獲得回数252005/04/15 16:52:21

ポイント20pt

親Noを持ってさえいれば問題なく再現できると思います


親Noは子Noよりも先に来ることが前提条件ですが、

(運用上、親よりも子が先に来ることはありえないでしょう。)

一括取得出来た場合、自分のインデントの深さ=親No+1で求められます。

id:nakeyouguisu

孫記事の親Noは子記事の番号になるわけですが、

これだけだと自分の記事番号を親番号に持つ記事ということで何度もSQL発行をする必要がでてくるように感じます。

2005/04/20 11:49:00
id:mady No.4

mady回答回数86ベストアンサー獲得回数02005/04/19 16:27:22

ポイント20pt

>再帰的取得ではなくデータベースから一括取得するパターン


そんなパターンで実装している例があるんですか?ちょっと想像できませんね…。


「子がいくつあるかわからない・何階層あるかわからない」という時点で、再起処理を行わなければ処理できない気がします…。


再起処理が煩雑に感じるということですが、コード自体はシンプルに記述することができます。


DBに何度もアクセスすることがパフォーマンスの低下を招くというのであれば、ルートノードのIDをデータとして持ち、ツリー1つ分のデータを取得してからプログラム内で親子関係を結び付けていくとすると処理速度は向上すると思います。


結局DB取得を再起しない代わりに、別の部分(ツリー作成)で再起処理をしないといけないことになると思います。

id:nakeyouguisu

参照先の掲示板はcgiなのでdatにデータを落とし込み表示するときはそのまま表示しているのだと思います。

そのようにすれば書き込みの処理手間>表示の処理手間になり、結果的には良いパフォーマンスが得られるかと思います。

再帰的ではない方法ですがあまりスマートではありませんが、私が今思いつく範囲だと、

・ルート親記事番号、親記事番号、スレッド内表示順序、階層順位

上記を保持し 書き込み時に親記事番号のスレッド内表示順序+1より多い、

同じルート親記事番号のスレッド内表示順序を+1でupdate

すくなくとも只のselectとorder byでツリー構造は再現できるかと思います。

掲題のサイトのように、途中割り込みがあっても、同じ階層の記事があるのかどうかを、

判別させる情報を格納しておくべきか。また、書き込み時に他の記事のレコードを更新するのはどうなのか。など、問題は多くありそうです。

2005/04/20 12:01:59

コメントはまだありません

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません