2010-02-22 5 views
0

J'essaie de faire une fonctionnalité de messages similaire au facebook. Juste le message et pas facebook. Une brève description aime ça.Problème relationnel dans Cakephp. Comment chercher des données?

1) Il y a un certain nombre d'utilisateurs (table utilisateur) 2) Une personne peut envoyer un message à une ou plusieurs personnes. 3) Il peut y avoir plusieurs réponses au même message. 4) Si c'est envoyer à plusieurs personnes. Tout le monde peut répondre et c'est montrer à tous.

Tables utilisées

messages Table

id 
timestamp 
sender_id 
subject 
message 
due_date 
urgent_flag 
open_flag 
reply_id 

message_user (tableau)

id 
timestamp 
message_id 
receiver_id 
read_flag 

Les relations CakePHP sont les suivantes:

message Modèle

var $hasMany = array(
     'MessageUser' => array(
      'className'  => 'MessageUser', 
      'foreignKey' => 'message_id',  
       ) 
    ); 
var $belongsTo = array (
    'User' => array (
     'className' => 'User', 
     'foreignKey' => 'sender_id', 
    ) 
); 
var $hasAndBelongsTo=array(
    'Message' => array (
     'className' => 'Message', 
     'foreignKey' => 'reply_id', 
     ) 
); 

MessageUser Modèle

var $belongsTo = array (
    'User' => array (
     'className' => 'User', 
     'foreignKey' => 'receiver_id', 
    ), 
    'Message' => array (
     'className' => 'Message', 
     'foreignKey' => 'message_id' 

    ) 
); 

Questions:

1) est mon approche correcte? Ou le schéma de base de données doit être révisé. 2) Si oui, comment dois-je récupérer les données pour la boîte de réception? C'est un peu complexe car je veux montrer la conversation pour les messages que les gens m'ont envoyés. Par exemple, l'utilisateur 1 envoie un message à l'utilisateur 2. L'utilisateur 2 ajoute 2 réponses à la même chose. Alors la boîte de réception des utilisateurs 1 devrait montrer seulement 1 message. et quand je l'ouvre. il va montrer les messages précédents aussi .. (c'est similaire à facebook)

Un autre problème que je vois ici est, Comment supprimer les messages? Supposons que l'utilisateur 1 supprime un message qu'il ne doit rien afficher dans sa boîte de réception. mais l'utilisateur 2 peut voir toute la conversation qu'il a eue.

+0

Si vous vous attendez à ce que les réponses threadées soient courantes, je suggérerais d'utiliser le comportement de l'arborescence sur la table, car cela devrait vous aider à récupérer un thread complet. –

+0

pouvez-vous expliquer cela en détail .. –

Répondre

0

WRT votre schéma, je voudrais seulement définir les relations dans la direction dont vous avez besoin pour y accéder. Ainsi, si vous n'avez jamais besoin d'accéder à l'Utilisateur avec un message, ne liez pas les messages aux utilisateurs. Cela peut créer des problèmes de récursion où vos modèles vont chercher beaucoup trop de données, parce que vous avez une boucle circulaire (Utilisateur hasMany Message, Message HasMany User, etc.) C'est en fait ce qu'est la relation HABTM, donc utilisez-la à la place de hasMany (si vous voulez que ce soit une relation bidirectionnelle).

Mon commentaire a mentionné le comportement de l'arbre. En termes simples, il vous permet de stocker facilement des données hiérarchiques dans une table de base de données relationnelle. Je ne vais pas répéter le manuel, mais vérifiez http://book.cakephp.org/view/91/Tree et google autour pour des exemples. Je suis à peu près sûr que c'est ce que vous voulez utiliser pour les réponses threadées. Un autre mot d'avertissement - si vous allez utiliser ceci avec une base d'utilisateurs sérieuse, lancez des tests de charge sur cette partie de votre base de données. Je ne suis pas sûr à quel point TreeBehavior fonctionnerait avec des millions de lignes sur un serveur bon marché.

Questions connexes