Bonjour
Je remercie par avance ceux qui auront le courage de lire ma question et d'y répondre ^^.
Je développe une application web (PHP/MySQL) de question/réponse, comme stackoverflow (je sais qu'il y a déjà des solutions existantes comme question2answer, là n'est pas la question).
Donc en gros, le point le plus important ce sont les messages qui peuvent être de 3 types :
- Question : une question peut avoir 0,N réponses
- Réponse : une réponse appartient à une question
- Commentaire : un commentaire est un message qui appartient à une question ou à une réponse
Voilà ce que ce ça donne à l'affichage :
Et voici le schéma de ma base de données :
schema.sql
J'ai choisi de rassembler les questions, réponses et commentaires dans une même entité : la table post (message), avec un champ type qui les différencie :
Q: Question
A: Réponse (pour answer)
C: Commentaire
Il y a aussi un système de tag pour les questions, et un système de vote qui permet aux utilisateurs de voter pour ou contre une question/réponse.
Maintenant, passons à ce qui m'amène ici :
Sur le papier ce schéma a l'air raisonnable, mais je suis déçu par les performances (pourtant je pense avoir mis des index là où il faut).
Si je veux récupérer toutes les informations d'une question, je suis obligé de faire 2 jointures : une pour joindre les réponses à la question, et une seconde pour joindre les commentaires :
Donc je souhaite avoir votre avis, j'envisage plusieurs solutions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SELECT qac.*, IFNULL(SUM(v.value), 0) AS _score, u.username, u.email , NULL AS _user_vote FROM sc_post q LEFT JOIN sc_post qa ON (qa.parent_id = q.id AND qa.`type` = 'A') OR qa.id = q.id LEFT JOIN sc_post qac ON (qac.parent_id = qa.id AND qac.`type` = 'C') OR qac.id = qa.id LEFT JOIN sc_vote v ON v.post_id = qac.id LEFT JOIN sc_user u ON u.id = qac.user_id WHERE q.id = '2731' AND q.`type` = 'Q' GROUP BY qac.id ORDER BY qac.`type` ASC, IF(qac.`type` = 'C', qac.created, NULL) ASC, qac.resolved DESC, _score DESC
- Optimiser ma requête (mais dans ce cas, je ne vois pas comment, si vous avez des suggestions...)
- Ajouter un champ de dénormalisation dans la table post : "question_id".
Ce champ va contenir l'id de la question auquel appartient le message (peut importe son type), comme ça plus besoin de jointure.
Je compte gérer la mise à jour de ce champ avec des triggers.- Utiliser la représentation intervallaire (MPTT) pour stocker la hiérarchie des post (Question/Réponse/Commentaire)
Qu'est-ce que vous en pensez ?
Merci
Partager