2010-05-28 14 views
6

Quiero crear algo así como reddit donde tienen comentarios, luego responde al comentario, luego responde a la respuesta.¿Cómo respondo a los comentarios? (PHP)

Qué tipo de estructura de base de datos ¿Utilizan así:

1. they keep track of all the comments to a posting 
2. a reply to a comment 
3. a reply to a reply 

Todo lo que tengo derecho es, es sólo un anuncio y un montón de comentarios relativos a la misma como ..

POSTING TABLE 
posting_id | title | author 

COMMENTS TABLE 
comment_id | posting_id | comment 

REPLIES TABLE 
???? 

Cómo hacer Relaciono los comentarios a las respuestas? ¿Qué tipo de CSS usan para dar respuestas a espacios sangrados?

EDITAR: Gracias por las respuestas! Ahora mi única pregunta es ¿cómo sangrado las respuestas? Tal como ..

you like food 
    yes I love italian 
     Yes i do like it too 
    chinese is best 

Respuesta

6

Puede añadir otra columna a la tabla especificando los comentarios parent_comment_id donde se rellena con el ID del comentario (o respuesta) el usuario está respondiendo. En el caso en que el comentario sea una respuesta directa a la publicación (no una respuesta a un comentario) esta columna sería nula.

+3

Exactamente: los comentarios son comentarios, sean o no respuestas a otros comentarios. –

+0

Lo siento, soy muy lento. ¡Entiendo! Gracias. Ahora mi pregunta es ¿cómo sangrado las respuestas? ¿Necesitaría saber algún tipo de relación? Tal como esta respuesta es la primera, esta respuesta es la segunda, así que sangría x2, esta respuesta es la tercera, así que identx3 – jpjp

+0

@jpjp: Haría esto en el nivel de la aplicación. Cuando construyes el árbol de comentarios, sabes mucho para sangrarlos. Solo uno más como padre. –

0

Agregue otro campo a su tabla de comentarios que contenga "reply_to" o algo así, y almacene el id del comentario al que responde.

0

que podría hacer que la mesa de comentarios genérico de este modo:

COMMENTS TABLE 
comment_id | posting_type | posting_id | comment 

donde posting_type es una especie de discriminador, por ejemplo, una cadena de 'post' o 'comentario', o un número entero para una mayor eficiencia (1 = post , 2 = COMENTARIO, etc.).

editar: admitidamente esto es más complicado, pero significa que puede usar la misma tabla de comentarios para comentarios sobre cualquier cosa, no solo publicaciones y otros comentarios.

+0

No se encuentra la relación con el comentario "principal". –

+0

no, porque entonces posting_type es COMMENT y posting_id es el ID de comentario principal. – oedo

+0

Esto rompe una convención pseudo FK. Además, en este caso no podría agregar un FK a la tabla ya que el posting_id ahora también se referiría a sí mismo. –

0

No necesita la tabla de respuestas. Como otros ya han señalado correctamente, la recurrencia es el camino a seguir con un RDBMS. Siempre puede considerar usar un DBMS de estilo nosql, para evitar tener que lidiar con la recursión.

1

Haría eso haciendo una tabla de referencia cruzada.

Ejemplo:

Tabla: Mensajes

Columns: pstkey | userid | postMessage | etc...

pstkey es la clave para el cuerpo de correos. ID de usuario es la persona que creó la publicación. postMessage es la entrada de entrada real.

Tabla: Comentarios

Columns: comkey | pstkey | userid | commentMessage | etc...

comkey es la clave de los comentarios realizados. referenciado a la publicación usando la clave pst. ID de usuario es la persona que hizo el comentario. y luego commentMessage es el cuerpo del texto del comentario real.

Tabla: xref_postComm

Columns: xrefkey | pstkey | comkey | comkey2 |

Ahora viene la parte divertida. TODAS las publicaciones entran en la tabla de publicaciones. TODOS los comentarios entran en la tabla de comentarios. Las relaciones están todas definidas en la tabla de referencia cruzada.

Realizo toda mi programación de esta manera. Tuve el privilegio de trabajar con uno de los mejores ingenieros de bases de datos del mundo que se retiró y me enseñó algunos trucos.

Cómo utilizar la tabla de referencias cruzadas:

xrefkey | pstkey | comkey | comkey2 
All that you look for is the population of a given field. 

xref (Auto Incremented) 
pstkey (Contains the pstkey for the post) 
comkey (Contains the comkey for the comment post) 
comkey2 (Contains the comkey for the comment post) 
     (but only populate comkey2 if comkey already has a value) 
and of course you populate comkey2 with the key of the comment. 

SEE, no reason for a 3rd tabel! 

With this method you can add as many relationships as you want. 
Now or in the future! 

comkey2 es su respuesta a una respuesta. Donde esta sola fila contiene ... la clave de la publicación, la clave del comentario y la clave de la respuesta al comentario de la respuesta. Todo hecho por población de xref.

 
EXAMPLE: 
PAGES.... Page table 

POSTS 
pstkey | pageid | user| Post 
------------------------------------- 
| 1 | 1 | 45 | Went to the store the....| 
| 2 | 2 | 18 | Saw an apple on tv..... 

COMMENTS 
comkey | pstkey | user | Comment 
----------------------------------------------- 
| 1 | 1 | 9 | Wanted to say thanks... 
| 2 | 1 | 7 | Cool I like tha..... 
| 3 | 2 | 3 | Great seeing ya.... 
| 4 | 2 | 6 | Had a great.... 
| 5 | 2 | 2 | Don't sweat it man... 

xref_PostCom 
xrefkey | pageid | pstkey | comkey | comkey2 | 
---------------------------------------------- 
| 1 | 1 | 1 | NULL | NULL | Post1 on Page1 
| 2 | 1 | 1 | 1 | NULL | Comment1 under Post1 
| 3 | 1 | 1 | 2 | NULL | Comment2 under Post1 
| 4 | 2 | 2 | NULL | NULL | Post2 on Page2 
| 5 | 2 | 2 | 3 | NULL | Comment3 under Post2 on Page2 
| 6 | 2 | 2 | 4 | NULL | Comment4 under Post2 on Page2 (a second Comment) 
| 7 | 2 | 2 | 4 | 5 | Explained below.... 
Comment key 5 is matched with comment key 4....under post2 on Page 2 

Si sabe nada acerca de unirse a, unirse a la izquierda, se unen a la derecha,/exterior combinación interna creación de SELECT para obtener los arreglos de datos utilizando estas relaciones, su trabajo se vuelve mucho más fácil.

Creo que el ingeniero lo llama básicamente "el mapa de datos" de las relaciones definidas. El truco ahora es cómo acceder a ellos utilizando estas relaciones. Se ve difícil al principio, pero sé lo que sé, me niego a hacerlo de otra manera.

Lo que ocurre al final es que terminas escribiendo 1 script que dice, vale, ve a hacer todo, y vuelve. Finalizará con una llamada de función que solicita la página 1. Devuelve con la página 1, publicación 1, comentario1 3 y las respuestas a la respuesta en 1 matriz. echo para salida y hecho.

ACTUALIZACIÓN PARA EL COMENTARIO Dije lo mismo la primera vez que me lo mostraron. De hecho, realmente me estaba enojando que el programador de bases de datos me obligara a hacerlo de esta manera. Pero ahora lo entiendo Las ventajas son muchas.

Ventaja 1) Se puede escribir 1 consulta para sacarlo todo en 1 foto.

2) Las respuestas en múltiples consultas pueden rellenar matrices en una estructura que al imprimir la página, un bucle en un bucle puede mostrar la página.

3) La actualización de su software que lo usa puede soportar cualquier posible cambio de diseño que pueda imaginarse. Capacidad de expansión impecable.

El tipo que me lo enseñó fue el arma contratada que rediseñó las bases de datos sears y jcpenny. Cuando tienen 9 libros yendo a la misma casa debido a problemas con los registros duplicados.

Las tablas de referencia cruzada previenen muchos problemas en el diseño.

El corazón de esta teoría es que una columna no solo puede contener datos sino que también sirve como una declaración verdadera o falsa al mismo tiempo. Eso en sí mismo ahorra espacio. ¿Por qué buscar 20 tablas cuando puedes buscar una? Una tabla de referencia cruzada indexada le puede decir todo lo que necesita saber sobre las otras 20 tablas, su contenido, lo que necesita, lo que no necesita e incluso necesita abrir la otra tabla.

EN CORTO: 1 Referencia cruzada que contiene nada más que INT (2/11) que te dice todo lo que necesita saber antes de que usted abra otra mesa, no sólo contiene la capacidad de expansión sin defectos, pero los resultados de velocidad de iluminación. Sin mencionar la poca posibilidad de registros duplicados. Para usted y para mí, los registros duplicados pueden no ser un problema. Pero para Sears con 4 mil millones de registros a $ 11 por libro, los errores se suman.

+0

¿Puedes decir cuál es la ventaja de esto? Todo lo que veo es que tengo que hacer más uniones ... –

2

Para mostrar las respuestas dentro de las respuestas, tendrá que hacer una llamada recursiva para seguir generando las respuestas secundarias.

Algo así como

function get_comments($comment_id) { 
    print '<div class="comment_body">'; 

    // print comment body or something? 

    if (comment_has_reply($comment_id)) { 
     foreach(comment_comments($comment_id) as $comment) { 
      get_comments($comment->id); 
     } 
    } 

    print '</div>'; 
} 

Para comentarios sangría sin embargo, el uso de CSS.

<style type="text/css"> 
.comment_body { 
    margin-left:10px; 
} 
</style> 

De esta manera sub respuestas están sangrados más de los padres, y sus sandwiches son sangría aún más, y así sucesivamente.

Cuestiones relacionadas