人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: nakeyouguisu
●カテゴリ:ウェブ制作
✍キーワード:TREE URL イメージ ツリー構造 データ
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● typista
●20ポイント

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

・スレッドNo.

・タイトル

・投稿者

・日にち

・時間

・本文

・ブラウザ情報

・親スレッドNo.

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

で良いと思います。


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

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

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


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


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

◎質問者からの返答

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


2 ● shampoohat
●20ポイント

http://www.hatena.ne.jp/

はてな

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


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

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


なので、


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

// 最悪、なくてもいい

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

- 発言のID

- 直前の発言(親)のID


があれば良いです。

◎質問者からの返答

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

煩雑すぎませんかね?


3 ● dev_zer0
●20ポイント

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


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

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

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

◎質問者からの返答

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

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


4 ● mady
●20ポイント

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


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


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


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


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


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

◎質問者からの返答

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

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

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

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

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

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ