15

記事に対するコメントを保存する cms があります。これらのコメントは、スレッド化されていてもスレッド化されていなくてもかまいません。技術的には同じですが、スレッド化されていない場合は返信欄が空欄になっているだけです。私のアプリケーションは sqlLite、MySQL、および pgsql で動作するため、かなり標準的な SQL が必要です。

私は現在コメントテーブルを持っています

comment_id
article_id
user_id
comment
timestamp
thread (this is the reply column)

私の質問は、データベース内のスレッド化されたコメントを最もよく表す方法を見つけ出すことです。おそらく、コンテンツなしでツリー セットをサポートする別のテーブルと、テキストを保持する単純なテーブルでしょうか? おそらく、それはすでにある方法ですか?おそらく別の方法ですか?

コメントがスレッド化されていない場合は、タイムスタンプで簡単に並べ替えることができます。

それらがスレッド化されている場合、私はこのようにソートします

ORDER BY SUBSTRING(c.thread, 1, (LENGTH(c.thread) - 1))

ORDER BY からわかるように、関数ベースのインデックスは実際には Oracle にしか存在しないため、コメント クエリはインデックスを使用しません。コメントページを高速化するのを手伝ってください。

4

6 に答える 6

6

答えが少し遅れていることは承知していますが、ツリー データではクロージャ テーブルを使用するのが適切なリレーショナルな方法です。 http://www.slideshare.net/billkarwin/models-for-hierarchical-data

次の 4 つの方法について説明します。

  • 隣接リスト (単純な親の外部キー)
  • パスの列挙 (受け入れられた回答に記載されている Drupal 戦略)
  • ネストされたセット
  • クロージャー テーブル (祖先/子孫の事実を別の関係 [テーブル] に保存し、距離列を使用することもできます)

最後のオプションには、他のオプションと比較して CRUD 操作が簡単であるという利点があります。コストはスペースです。これは、最悪の場合、数値ツリー ノードで O(n^2) サイズですが、実際にはそれほど悪くはありません。

于 2013-04-07T08:15:09.513 に答える
2

隣接モデルとネストされたセット モデルのどちらかを選択できます。MySQL で階層データを管理するという記事は、優れた紹介になります。

理論的な議論については、Celko のTrees and Hierarchiesを参照してください。

データベースがウィンドウ関数をサポートしている場合、スレッド化されたリストを実装するのはかなり簡単です。必要なのは、次のようなターゲット データベース テーブルの再帰参照だけです。

create Tablename (
  RecordID integer not null default 0 auto_increment,
  ParentID integer default null references RecordID,
  ...
)

次に、再帰的な共通テーブル式を使用して、スレッド ビューを表示できます。例はこちらから入手できます。

于 2009-05-10T22:52:36.567 に答える