2009-11-25 6 views
0

J'écris une simple fonction de type "Facebook Wall" où un utilisateur peut poster sur le mur d'une autre personne et les gens peuvent simplement répondre à ce poste mural, ou poster un nouveau message mural. Les utilisateurs ne peuvent pas répondre à une réponse, vous ne pouvez pas répondre au poste de mur d'origine (comme facebook)Qu'est-ce qu'un bon schéma db et une méthode pour interroger une fonctionnalité "Facebook Wall"

Mon schéma db mySQL originale que je l'avais pensé va comme ceci:

 
post_id (pk) 
post_text (char) 
date_posted (datetime) 
is_parent (bool) 
parent_id (id of parent) 

Comment ça marche:
Si quelqu'un publie un nouveau message sur le mur, is_parent sera défini sur 1 et parent_id sera défini sur null.

Si quelqu'un publie une réponse à ce post, is_parent sera 0 et parent_id sera défini sur l'ID de la publication parente.

Mes Questions

  1. Est-ce un bon schéma pour cette fonction? Sinon, quel schéma utiliseriez-vous?
  2. Si c'est bon, comment puis-je faire une seule requête qui retournera tous les messages muraux dans l'ordre du dernier posté, tout en groupant les enfants avec le parent de sorte que lorsque je itére sur le résultat de la requête, le parent et les enfants tous viennent ensemble.
  3. Ou est-il préférable de faire 2 requêtes? Une requête pour tous les parents, 1 requête pour les enfants.

Répondre

1

Tout d'abord. Je ne pense pas que vous ayez besoin de deux champs dans le même but. parent_id est suffisant dans ce cas. Lorsque vous avez défini l'auto-incrémentation post_id. La première valeur attribuée sera 1, donc parent_id = 0 ne se produira jamais. Vous pouvez supposer quand parent_id = 0 c'est un post de premier niveau.

Il serait préférable d'utiliser une seule requête pour toutes les réponses.

+0

Merci Darkerstar. Cela a fait sens sur le parent_id = 0. Et il est également devenu beaucoup plus simple d'interroger toutes les réponses en tant que requête distincte. – justinl

0
  1. Aucune idée/Probable. Perdre la colonne is_parent.
  2. J'ai récemment fait cela en interrogeant tous les messages triés par ordre croissant de post_id. Puis mis en cache dans un tableau 2D avec un peu de PHP (array ['parrent'] -> array ['post'] ... []).
  3. On devrait le faire dans la méthode décrite dans # 2
Questions connexes