PHP / MySQLアプリケーション用のスレッド化されたメッセージ表示(SlashdotやYoutubeのコメントなど)を設計していますが、コメントを並べ替えてページに分割し、たとえば1ページに20個のコメントを含めるにはどうすればよいか疑問に思っています。しかし、それでもそれらをネストします。
私のアプリのコメントは無制限のレベルでネストできます。この構造は、隣接関係テーブルであると私が信じているものを使用して表されます。これは、昇順/降順の関係を持つ各ペアの行を含む個別のテーブルです。その関係テーブルには、CHILDID、PARENTID、およびLEVELがあり、レベル2は「曽祖父母」などを意味します。
私の質問は、エンドユーザーにとっての使いやすさと、効率的なDBクエリを構築する実用性の両方の1つです。私はこれらのオプションを検討しました:
ツリー内の位置に関係なく、結果を日付ごとにページに分割します。これにより、特定の日付範囲内のすべてのコメントは、親と一緒に表示されなくても一緒に表示されます。親と同じ時間に投稿されたコメントはすべて同じページに表示され、その場合は「ネスト」して表示できますが、親から孤立したコメントがあります。これはおそらく許容範囲です-YouTubeのコメントで行われる方法です-親よりもはるかに遅れて作成されたコメントは、親と同じページに表示されません(親が最新のページにない場合)が、代わりに他の最新のコメント。
ツリーをトラバースするように、ノードを順番に取得します。これにより、日付よりもツリー構造が優先されますが、兄弟は日付で並べ替えることができます。これの利点は、親が最新のコメントからのページ数であっても、返信は常に親(返信するコメント)とともに配置されることです。これは、icanhascheezburgerブログなどのアプリで行われる方法です。誰もが最大の木の枝に返信を追加したくなるような方法のように、私はそれについていくつかのことが好きではありません。
3番目のオプションは、Slashdotと同じように行うことです。この場合、コメントをページに分割しませんが、1つの大きなツリーがあります。ページサイズを管理しやすくするために、代わりに低評価のコメントのカリングを開始します。
最初のクエリは、リレーションテーブルを指定した場合の最も単純なDBクエリだと思いますが、他のアイデアを受け入れることができます。
3種類すべてのこのようなシステムの中には、何らかの方法でネストレベルを制限するものがあります。これは、Xレベルを繰り返した後、兄弟であるかのように他のすべてを組み合わせることができるため、簡単に実行できます。たとえば、YouTubeのコメントは1つのレベルにしかレンダリングされません。他のシステムでは、5レベル程度後に「ネストレベルを超えました」と表示されることがあります。