Web アプリケーションの場合、ネストされたディスカッションを複数のページに分割するための最良の方法は何ですか?
-
06-09-2019 - |
質問
PHP/MySQL アプリケーション用のスレッド形式のメッセージ表示 (Slashdot や Youtube のコメントなど) を設計していますが、コメントを順序付けしてページに分割して、たとえば 1 ページに 20 件のコメントを含めることができるようにするにはどうすればよいのか疑問に思っています。ただし、まだ入れ子になっています。
私のアプリのコメントは無制限のレベルでネストできます。この構造は、隣接関係テーブル (上位/子孫関係を持つ各ペアの行を含む別個のテーブル) であると思われるものを使用して表されます。この関係テーブルには CHILDID、PARENTID、LEVEL があり、レベル 2 は「曾祖父母」などを意味します。
私の質問は、エンドユーザーの使いやすさと、効率的な DB クエリを構築する実用性の両方に関するものです。私は次のオプションを検討しました。
ツリー内の位置に関係なく、結果を日付ごとにページに分割します。これにより、特定の日付範囲内のすべてのコメントが、親と一緒に表示されない場合でも一緒に表示されます。親と同じ時期に投稿されたコメントはすべて同じページに表示され、その場合はコメントを「ネスト」して表示できますが、親から孤立したコメントも存在します。これはおそらく許容範囲です - これは YouTube のコメントで行われる方法です - 親よりもかなり後に作成されたコメントは、(親が最新のページにない場合) 親と同じページには表示されませんが、代わりに次のように表示されます。その他の最新コメント。
ツリーを走査するようにノードを順番に取得します。これにより、日付ではなくツリー構造が優先されますが、兄弟を日付で並べ替えることもできます。この利点は、親が最新のコメントから数ページ離れている場合でも、返信は常にその親 (返信先のコメント) と一緒に配置されることです。これは、icanhascheezburger ブログなどのアプリで行われる方法です。気に入らない点がいくつかあります。たとえば、最大の木の枝に誰もが返信を追加したくなる方法です。
3 番目のオプションは、Slashdot と同じようにすることです。コメントをページに分割せず、1 つの大きなツリーを持ちます。ページ サイズを管理しやすい状態に保つために、代わりに低評価のコメントを淘汰し始めます。
私のリレーションテーブルを考慮すると、最初のクエリは最も単純な DB クエリになると思いますが、他のアイデアも受け入れられると思います。
3 種類すべてのこのようなシステムの中には、何らかの方法でネスト レベルを制限するものがあります。これは簡単に実行できます。一度 X レベルにわたって再帰すると、他のすべてを兄弟であるかのように組み合わせることができます。たとえば、YouTube のコメントは 1 つのレベルにのみ表示されます。他のシステムでは、5 レベルほどの後に「ネスト レベルを超えました」と表示されることがあります。
解決
私は、ユーザーが一度に関心のシングルスレッドを読みたい傾向があるので、あなたがすべてのネストされたコメントをしたい理由があることを前提としています。それはユーザーが思考のコヒーレントチェーンのスレッドを作成します信じる理由を持っている、である、および/または何が一部のユーザーではなく、他の人の関心う1つのスレッドで議論します。
その場合はあなたが任意の日付(オプション1)によりページに渡ってスレッドを分割する理由、私は知りません。低格付けのコメント(オプション3)の殺処分を単一のページを使用すると、少し厳しいようだとコメントの投稿からユーザーを落胆します。あなたはスラッシュドットのような観客の質量を持っていればそれは良いことかもしれないが、それは、より一般的な訪問率を持つサイトのために望ましくないことがあります。
おそらくあなたは、同じページ上のすべてのスレッドで、オプション2のようなものを持つことができますが、スレッドが長すぎるなって開始した場合、それは、そのスレッドに専用のページにユーザーをとり、単一のリンクにロールアップされます。また、長いスレッドは単にスレッドの専用ページ内の適切な場所へのターンのリンクでは、それぞれが、自分の件名と作成者を表示するように減少させることができます。
私は最大のスレッドで無関係なコメントを投稿するユーザーのための傾向は、スレッドの終了を見つける、またはより適切だ糸を見つけるために周りのスクロールに煩わされることを望まないユーザーの産物であると思います。自動的に管理しやすい長さの1ページに表示されるすべてのスレッドの根を残して、長いスレッドを圧縮することにより、ユーザーは簡単に関心のスレッドをスキャンすることができ、必要であれば、それに追加します。