1

建築レベルでこれに苦労してきました。

コメントできるオブジェクトがあります。それをと呼びましょうPost。すべての投稿には一意のIDがあります。

ここで、その投稿にコメントしたいと思います。IDを外部キーとして使用できます。各投稿コメントには、投稿に関連するItemIDフィールドがあります。各投稿には一意のIDがあるため、「トップレベル」のコメントを割り当てるのは非常に簡単です。

ただし、コメントにコメントすると、PostCommentのIDに添付されるPostCommentCommentが必要になったように感じます。IDは順番に割り当てられるため、ItemIDを使用して、ツリー内のどこにコメントが割り当てられているかを区別することはできなくなりました。IEの投稿と投稿コメントの両方のIDが「5」である可能性があるため、外部キーの関係が無効です。

これは、PostCommentCommentCommentなどで無限に続く可能性があるようです...

これを解決するための最良の方法は何ですか?IDを添付するコレクションを知るために、コメントに「IsPostComment」などのフィールドを含める必要がありますか?これは私がこれまでに見た中で最高の解決策だと思いますが、今では、高価になり始めた再帰的なデータベース呼び出しを行う必要があると感じています。

つまり、私はを取得し、PostすべてのPostCommentsを取得しますwhere ItemID == Post.ID && where IsPostComment == true

次に、それをコレクションとして取得し、のすべてのIDを収集し、PostComments別の検索を実行してwhere ItemID == PostComment[all].ID && where IsPostComment == falseから、無限に繰り返します。

これは、すべてのレイヤーに対して呼び出しを行うことを意味します。100の投稿を呼び出す場合、1000のDB呼び出しを行って、それぞれ10レイヤーのコメントを取得する可能性があります。

これを行う正しい方法は何ですか?

4

3 に答える 3

3

という名前のテーブルは1つだけPostです。

CREATE TABLE Post
(
    PostID int PK,
    PostContent nvarchar,
    ParentPostID int FK null,
    ...
)

投稿には、ID、投稿コンテンツ、およびその他の必要なフィールドが含まれます。また、ParentPostIDもあります。これはnullable、への外部キーPostIDです。の場合、それParentPostIDnull元の投稿であることがわかります。親がいる場合は、投稿がコメントであることがわかります。これにより、コメントを必要なだけ深くネストすることができます。

于 2012-08-28T19:58:59.687 に答える
1

PostCommentComment やそれ以上のものではなく、PostComment だけが必要だと思います。

すべての PostComments には PostId があるため、その投稿のコメントを読み込むときは、PostId でクエリを実行するだけです。

すべてのコメントには、別のコメントを指す ParentId もあります (最上位のコメントには ParentId はありません)。このように、すべてのコメントに任意の深さのコメントを含めることができますが、データはデータベース内でフラットなままです。

特定の PostId を持つすべてのコメントをロードしたら、ParentId プロパティを使用してメモリ内にツリー/階層を組み立てることができます。

于 2012-08-28T19:56:41.703 に答える
0

すべてのコメントを同じテーブル構造に保持し、同じ ID シーケンスを使用します。それで:

  1. field を使用COMMENT_DEPTHして、再帰レベルを示しCOMMENT_DEPTH=0ますCOMMENT_DEPTH=1

  2. また、PARENT_COMMENTフィールドを使用します。を持つコメントの場合は null にする必要があり、 のCOMMENT_DEPTH=0場合は親コメント ID を含める必要がありますCOMMENT_DEPTH>0

これにより、複数レベルのコメントを持つこともできます。さらに、次の方法で投稿コメントを取得できます。

WHERE COMMENT_DEPTH=0

また、次の方法でコメント A にコメントできます。

WHERE PARENT_COMMENT=A.ID AND COMMENT_DEPTH=A.COMMENT_DEPTH+1
于 2012-08-28T20:03:24.613 に答える