11
votes

Structure MySQL pour commentaires et commentaires répond

J'ai pensé à celui-ci depuis un certain temps maintenant, j'ai besoin d'un moyen d'ajouter des réponses aux commentaires de la base de données, mais je ne sais pas comment procéder.

Ceci est ma table de commentaire (ne pas 't dire beaucoup mais c'est un démarrage): xxx

et voici ma requête actuelle: xxx

une option serait être de créer une nouvelle table appelée "commentaires_Replies" mais je ne sais pas si je suis capable de sélectionner tous les commentaires et commentez les réponses dans une requête, et si j'ajoute une nouvelle colonne appelée "Répondre" Je ne sais pas comment Triez-les pour obtenir chaque commentaire avec chaque réponse.

J'aimerais avoir des conseils sur la manière de traiter cela.

EDIT:

Suivre les réponses ci-dessous sur l'ajout de parent_comment_id Résultat dans ce type de tableau à partir de 1 commentaire et 2 réponses: xxx

Comment traiter cette matrice de travail , Est-il possible de séparer le commentaire des réponses?


0 commentaires

7 Réponses :


1
votes

Un commentaire Répondre est un commentaire avec un parent commentaire_id. Essayez d'ajouter COMMENT_ID en tant que champ à votre table de commentaires. Ce que vous obtiendrez est une structure d'arbre.

Si vous souhaitez récupérer un arbre complet de commentaires, votre meilleur pari est d'utiliser un ensemble imué ( https: //wiki.htc.lan/hierarchy_model ). Mais c'est une solution plus compliquée.

Voici quelques informations supplémentaires de mysql: http://mikehillyer.com / Articles / gérance-hiérarchical-data-in-mysql /


0 commentaires

3
votes

Ajouter un parent_comment_id colonne à votre table de commentaires. Faites-le facultatif. Lorsque vous interrogez, vous pouvez rejoindre tous les commentaires des enfants à chaque parent. Comme un peu de dénormalisation sélective (légère redondance), vous pouvez vous assurer que topic_id est également défini sur les commentaires de l'enfant, vous permettant de les tirer un peu plus faciles (en supposant que vous allez afficher tous les commentaires des enfants dans le fil de commentaire principal et non via des demandes d'ajax plus petites).

Construisez la présentation Toutefois, jetez les résultats dans MemCached (ou un fichier plat ou une mémoire ... Cependant, vous mettez en cache) et vous êtes défini.


0 commentaires

5
votes

Si vous voulez que les gens puissent répondre aux réponses (c'est-à-dire avoir une hiérarchie de réponses telle que vous le verriez, dites, un forum de message en ligne), j'ajouterais un champ Parent_CommENT_Id en option à la table des commentaires.

Votre table ressemblerait à ceci xxx

Votre requête montrant tous les commentaires et réponses serait quelque chose comme: xxx

Notez toutefois que, avec cette requête, vos réponses apparaîtraient également non seulement dans la colonne "Répondre", mais également dans la colonne "Commentaire" en tant que lignes supplémentaires à zéro ou plus de réponses.

pour montrer le Nom d'utilisateur des utilisateurs qui répondit à un commentaire, vous devrez vous joindre à deux fois sur la table des utilisateurs (d'abord pour l'utilisateur qui a posté le commentaire original, ainsi que pour les utilisateurs qui ont répondu). Essayez cette requête pour afficher les noms d'utilisateur des utilisateurs qui ont répondu: xxx


3 commentaires

J'ai ajouté le parent_comment_id et a changé la requête mais je ne sais pas quoi faire ensuite. Disons que j'ai 1 commentaire avec 2 réponses, cela générerait 2 commentaires, tous les deux auront le même commentaire, mais différentes réponses et les deux réponses auront les premiers commentaires Nom d'utilisateur. J'ai édité mon message principal avec un exemple.


J'ai édité la requête originale ci-dessus afin de montrer le nom d'utilisateur et la photo des utilisateurs qui ont répondu à un commentaire.


Ça a l'air bien, mais cela émettrait toujours une valeur de commentaire dupliquée où vous avez plus d'une réponse pour un commentaire, dois-je modifier la matrice de résultat avec le code côté serveur pour séparer les commentaires des réponses?



1
votes

On dirait que vous travaillez avec WordPress, ajouter un parent_comment_id aurait été une solution idéale, mais pas dans ce cas.

Tout d'abord, je ne pense pas que la modification des tables de base WordPress est une bonne idée. Deuxièmement, vous retrouverez un code complexe qui va rompre avec des mises à jour WordPress.

meilleur est un plugin comme commentaires intenses

toujours Si vous souhaitez créer votre propre solution, je dirais créer une autre table pour commenter les réponses. a) Votre nouvelle table ressemblerait à ce xxx

b) vous les récupérez de cette façon xxx

c) Maintenant, dans votre boucle de commentaires, vous pouvez obtenir les réponses telles que ceci xxx


1 commentaires

Je n'utilise pas WordPress, mais la solution a l'air assez bien. Je dois regarder plus dans cela pour voir si son optimal pour moi.



3
votes

J'ai décidé d'ajouter la colonne Parent_id dans la base de données et, au lieu de gauche, rejoindre les réponses, je viens de sélectionner tous les commentaires à la fois ultérieurement sur les commentaires et les réponses avec le code côté serveur, Heres la requête:

function sort_comments($ar)
{
    $comments = array();
    foreach($ar as $item)
    {
        if(is_null($item['parent_id'])) $comments[] = $item;
        else 
        {
            $parent_array = array_search_key($item['parent_id'],$comments,'id');
            if($parent_array !== false) $comments[$parent_array]['replies'][] = $item;
        }
    }
    return $comments;
}


2 commentaires

Quelle est la fonction array_search_key - il n'est pas une fonction de bibliothèque standard PHP


où est la fonction array_search_key ?? Existe-t-il dans PHP?



2
votes

Cela semble tous bien, mais que dire si la table contenait plus d'un million de lignes? Et certains commentaires pourraient être des centaines de milliers de rangées. Comment vont ces questions?


1 commentaires

C'est vrai, mais c'est très peu probable en ce moment, je pense que le meilleur moyen serait de les séparer à deux tables différentes si vous avez autant de données à gérer.



0
votes
function sort_comments($ar)
{
    $comments = [];
    $i=0;
    foreach($ar as $co){
      if(!empty($co['comment_replyof'])) {
        $comments[$co['comment_replyof']]['replies'] = $co;
      }else{
        foreach($co as $c => $o) $comments[$co['comment_id']][$c] = $o;
      }
    $i++;
    }
    return $comments;
}

SELECT C.*, U.id,U.fname, U.lname FROM (comment C) JOIN users U ON `enter code here`C.comment_user = U.id where C.comment_content='10' 

0 commentaires