0

私はコメントシステムを構築しています。コメントには多くの返信があります。

これをmysqlに実装する場合は、commentsテーブルを作成し、列を作成します。

  • comment_id
  • parent_comment_id

ここで、親コメントIDはコメントの場合は0であり、返信の場合は親コメントIDです。したがって、特定のコメントに対する返信を探している場合は、探しているparent_comment_idコメントと一致する必要があるコメントを探します。

コメントに返信があるかどうかを確認するためだけにテーブル全体を調べる必要があるため、これは冗長に思えますcomments(特に大きなデータの場合)。キーストアデータベースがある場合は、コメントID。その中には、日付順に並べられた返信のリストが含まれます。

では、この問題にはどちらのアプローチが適していると思いますか?

また、キーストアデータベースにリストとして保存される1対多の関係に問題を一般化したいと思います。また、キーストアデータベースの使用を推奨する場合、大規模なデータにはどれを推奨しますか?(これはメモリ内にあるため、redisを使用したくありません。また、コメントへの返信に頻繁にアクセスする必要があるとは思えません)。

返信ありがとうございます。

4

4 に答える 4

3

リレーショナル データベースは、この「隣接リスト」モデルを適切に処理する必要があります。

まずparent_comment_id、「ルート」コメントの に 0 を使用せず、NULL を使用します。次に、存在しないコメントに誤って返信を添付することを防ぐFOREIGN KEY をparent_comment_idtoから作成できます。comment_id

コメントに返信があるかどうかを確認するためだけに、コメント テーブル全体を調べる必要があります。

parent_comment_id(上記の FK を作成した場合は InnoDB が自動的に行った) のインデックスを作成したと仮定すると、指定されたコメントへの最初のレベルの返信を見つけるには、インデックス範囲スキャンが必要になります。インデックス レンジ スキャンと、それらが効率的である理由を理解するには、まずSQL インデックスの構造を理解する必要があります。

2 番目のレベルを見つけるには、別の範囲スキャンなどが必要になります。残念ながら、MySQL は、単一のデータベース ラウンドトリップですべてを実行できる再帰クエリをサポートしていませんが、それでもかなり効率的です。

測定を実行して、それが問題であると結論付けた場合は、「ネストされたセット」や「クロージャ」など、(さまざまなトレードオフを伴う) 階層を表すための他の戦略があります。Bill Karwin によるこのプレゼンテーションをご覧ください。

于 2013-02-03T11:24:24.030 に答える
2

テーブルを作成して、より柔軟にすることができます。

コメント=>comment_id、the_comment、count_replays

Comments_replay => parent_id、the_comment

コメントのリプレイがある場合、count_replaysの更新があります。

そして今、あなたはリプレイがある場合にifステートメントを実行し、それからそれらを要求することができます。

于 2013-02-03T13:13:46.213 に答える
2

実際、ほとんどのリレーショナル データベースでは、すべてのコメントを調べて、特定のコメントへの返信を特定する必要はありません。結局、これらのタイプのクエリは非常に頻繁に発生し、非常に最適化されています。にインデックスを作成することも検討してparent_comment_idください。繰り返しますが、これは単一レベルの親子関係がある場合にのみ機能します。順番にコメントされているコメントがある場合は、データを保存する別の方法が役立つかもしれません。

于 2013-02-03T09:42:22.727 に答える
2

Branko の返信に賛成票を投じます。親フィールドのインデックスは適切です。この場合、ゼロよりも NULLS の方が適切に機能します。さらに、参照整合性の制約は、あなたを傷つける以上に役立ちます。

いくつかの余分なポイント。

アプローチを使用すると、即時の返信だけでなく、返信や返信への返信などで構成されるサブツリー全体を検索できます。これは役に立つかもしれません。

次に、「フォレスト」と呼ばれるデータ構造があります。これは一連のツリーを含むテーブルで、各ツリーはそのルートとして、この場合は親のないコメントを持ちます。Web 検索では、各ディスカッションがコメントで始まり、各ディスカッションが応答のツリーである、ディスカッションの森の設計に関するいくつかの優れた記事が表示されるはずです。多くの人がまさにこのケースを設計しました。

于 2013-02-03T13:02:33.757 に答える