Estrutura de dados adequada para comentários que podem ser comentados

4

Está lutando com isso em um nível arquitetônico.

Eu tenho um objeto que pode ser comentado, vamos chamá-lo de Post . Cada postagem tem um ID exclusivo.

Agora quero comentar esse Post e posso usar o ID como uma chave estrangeira, e cada PostComment tem um campo ItemID que se correlaciona com o Post. Como cada Post possui um ID único, é muito fácil atribuir comentários de "Nível Superior".

No entanto, quando eu comento um comentário, sinto que agora preciso de um PostCommentComment, que é anexado ao ID do PostComment. Como os ID's são atribuídos sequencialmente, não posso mais simplesmente usar o ItemID para diferenciar onde na árvore o comentário foi atribuído. I.E. tanto um Post quanto um Post Comment podem ter um ID de '5', então meu relacionamento de chave estrangeira é inválido.

Isso parece que pode continuar infinitamente, com o PostCommentCommentComment, etc ...

Qual é a melhor maneira de resolver isso? Devo ter um campo no comentário chamado "IsPostComment" ou algo parecido para saber para qual coleção anexar o ID? Isso me parece a melhor solução que já vi até agora, mas agora sinto que preciso fazer chamadas DataBase recursivas que começam a ficar caras.

Ou seja, recebo um Post e obtenho todos os pós-comentários where ItemID == Post.ID && where IsPostComment == true

Depois, tomo isso como uma coleção, reúno todas as IDs de PostComments e faço outra pesquisa where ItemID == PostComment[all].ID && where IsPostComment == false , depois repito infinitamente.

Isso significa que faço uma chamada para cada camada e, se estiver chamando 100 Posts, posso fazer 1000 chamadas de DB para obter 10 camadas de comentários cada.

Qual é o modo correto de fazer isso?

    
por Wesley 28.08.2012 / 21:50
fonte

2 respostas

11

Tudo o que você precisa é de PostID para cada coisa que um usuário escreve e um ParentPostID que é anulável e aponta para um pai PostID . Se for null, é um Post e, se não for null, é um comentário. Comentários podem ter comentários.

Estrutura básica da árvore.

    
por 28.08.2012 / 21:54
fonte
4

Aqui está um exemplo para o SQL Server 2005+ com base na resposta de Scott acima.

CREATE TABLE posts 
(
    PostID INT NOT NULL CONSTRAINT PK_Posts PRIMARY KEY IDENTITY(1,1)
    , ParentPostID INT NULL, PostText NVARCHAR(255)
);

INSERT INTO posts VALUES (NULL, 'This is top-level post #1');
INSERT INTO posts VALUES (NULL, 'This is top-level post #2');
INSERT INTO posts VALUES (1, 'This is a comment on post #1');
INSERT INTO posts VALUES (1, 'This is also a comment on post #1');
INSERT INTO posts VALUES (3, 'This is a sub-comment on comment #1');
INSERT INTO posts VALUES (2, 'This is a comment on post #2');
INSERT INTO posts VALUES (2, 'This is a comment on post #2');

WITH Comments(ParentID, PostText)
AS 
(
    SELECT ParentPostID, posts.PostText 
FROM posts 
WHERE ParentPostID IS NOT NULL
    UNION ALL
    SELECT ParentPostID, posts.PostText 
FROM posts 
    INNER JOIN Comments c ON posts.PostID = c.ParentID 
)
SELECT p1.PostText AS Post, Comments.PostText AS Comment
FROM Comments 
LEFT JOIN posts p1 ON Comments.ParentID = p1.PostID
WHERE ParentID IS NOT NULL;

Aqui está o resultado:

    Post                            Comment
    This is top-level post #1       This is a comment on post #1
    This is top-level post #1       This is also a comment on post #1
    This is a comment on post #1    This is a sub-comment on comment #1
    This is top-level post #2       This is a comment on post #2
    This is top-level post #2       This is a comment on post #2
    This is top-level post #1       This is a comment on post #1
    
por 28.08.2012 / 23:06
fonte