2009-12-05 3 views
3

Je me demandais s'il existait une structure de base de données générale pour la situation suivante.Le marquage/le contenu du marquage a changé depuis la dernière fois que l'utilisateur l'a vu

Dans mon application Web, il y a des utilisateurs et des projets.

Maintenant, chaque fois qu'un projet est créé ou modifié, tous les utilisateurs qui n'ont pas vu que le nouveau/projet modifié encore doivent être notifiées d'une certaine façon (par exemple, une icône devant le titre du projet ou quelque chose)

Existe-t-il une méthode générale pour cela? Si oui, quelle est la méthode et comment puis-je le faire de la manière la plus efficace?

Répondre

3

Ressemble à une relation multi-utilisateurs pour "ce que les utilisateurs ont vu quels projets", mieux implémentée avec une table avec exactement deux colonnes - une clé étrangère dans la table des utilisateurs et une dans la table des projets. Lorsqu'un projet est créé, vous n'avez pas encore ajouté d'entrées à cette table (sauf si vous pouvez identifier un utilisateur comme étant le créateur qui a vu le projet, auquel cas vous ajoutez cette entrée) - vous ajoutez une entrée (U, P) chaque fois que "l'utilisateur U a vu le projet P" se produit. Lorsqu'un projet est modifié, vous supprimez toutes les entrées de la table concernant ce projet (à nouveau, sauf peut-être celle de l'utilisateur qui effectue la modification, si vous savez qui).

Besoin de SQL pour le schéma de cette table et les opérations que j'ai décrites en mots?

Modifier: un intervenant demande SQL, donc (en supposant InnoDB, dans le cas de MySQL), en supposant que les tables utilisateur et projet ont des clés int uid et pid respectivement:

create table Seen (uid int, pid int, 
        foreign key uid references user(uid) on delete cascade, 
        foreign key pid references project(pid) on delete cascade, 
        primary key (uid, pid)) 

Lorsqu'un existant le projet avec un PID de P est modifié, donc aucun utilisateur n'est maintenant considéré comme l'ayant "vu", delete from Seen where pid=P (ie, enlever toutes les entrées pour P de cette table); Si la modification est effectuée par l'utilisateur U, l'utilisateur U est considéré comme l'ayant vu, vous pouvez ajouter and uid!=U à la clause where du delete. Pour marquer le fait qu'un certain utilisateur U a maintenant vu le projet P, insert ignore into Seen(uid, pid) values (U, P) (la partie ignore signifie "ne rien faire si la ligne était déjà là", de sorte que l'enregistrement des conditions "vues" plus d'une fois est inoffensif, bien sûr redondant).

+0

je dis aller, plus d'informations ne peut jamais être une mauvaise chose –

+0

merci! SQL serait bien mais je pense que je peux le gérer :) – Bundy

0

Ce que je voudrais faire est de créer une sorte d'entité "Notification" (une table). Vous pouvez ensuite laisser votre code de base de données-client insérer une nouvelle notification lorsque quelqu'un ajoute un nouveau projet. Ou vous pouvez le faire automatiquement en utilisant triggers dans la base de données elle-même.

La manière exacte dont vous concevez les notifications (quelles tables et quels attributs sont nécessaires) dépend vraiment de la conception de votre application.

0

Peut-être quelque chose comme

 
users_viewed_projects 
+--------+-----------+ 
+ userId | projectId | 

Ajouter une entrée à cette table pour le userId/projectId une fois son été vu par cet utilisateur.

1

Vous avez besoin d'une table qui indique quand (si jamais) chaque utilisateur a vu la dernière fois chaque projet.

create table user_seen_project 
(
user_id int, 
project_id int, 
last_seen datetime 
); 

Pour chaque projet dont vous avez besoin, changez le temps.

create table project 
(
    project_id int 
    ... 
    last_changed datetime 
); 

Ensuite, vous pouvez faire dès jointure externe pour l'utilisateur actuel, comme celui-ci

select project_id, /* other fields*/ last_changed, last_seen 
from project p outer join user_seen_project up 
on p.project_id=up.project_id 
where up.user_id=$currentUser 

Dans le jeu de résultats:

  • lorsque last_seen est nul - l'utilisateur n'a pas vu ce projet (nouveau projet)
  • lorsque last_seen < last_changed - projet mis à jour
  • quand last_seen> last_changed - 'vieux' projet
0

Vous souhaitez ajouter une colonne de version à votre table de projet. Ensuite, chaque fois que vous référencez les projets auxquels un utilisateur a accès, ajoutez une colonne pour afficher la dernière version du projet utilisé par l'utilisateur.

Maintenant, chaque fois que vous remplissez des informations sur les utilisateurs et leurs projets, vous pouvez vérifier le numéro de version de la dernière version des projets et s'il y a eu un changement dans le projet, vous le saurez.

Bien sûr, cela crée une surcharge. Vous devrez mettre à jour un numéro de version d'utilisateur pour un projet une fois qu'ils auront noté la mise à jour, et chaque fois que quelque chose changera dans votre projet, vous devrez incrémenter le numéro de version. Comme mentionné par kigurai, vous pouvez utiliser des déclencheurs pour automatiser certaines de ces opérations.

1

Espérons que ceci est explicite.

userproject_model_01

+0

merci! Super article! – Bundy

Questions connexes