2010-09-28 3 views
0

J'ai une table MYSQL qui contient des informations sur les événements. J'ai besoin d'un mécanisme qui met à jour le statut de chaque événement en fonction de sa date ("over" si c'est une date antérieure). Quelle est la meilleure façon de faire une telle chose? Mettre à jour le statut de l'événement quand un utilisateur se connecte (routine inutile pour la plupart des utilisateurs), créer une sorte de tâche interne (comme un travail cron?), Ou de toute autre manière. Actuellement, le statut de l'événement est mis à jour uniquement lorsque le créateur se connecte. Cela fonctionne mais un autre utilisateur voit l'événement comme "planifié" jusqu'à ce que le créateur se connecte, même si la date est passée. Im en utilisant PHP en passant. Mercimise à jour automatique de la table MYSQL selon la date

+1

le mettre à jour lorsqu'un événement est demandé. –

+2

La date est le seul critère? Alors pourquoi devez-vous mettre à jour quelque chose? Utilisez plutôt une arithmétique de date comme par exemple. comparer la valeur de la date par rapport à maintenant(). – VolkerK

+0

C'est un bon point, mais l'application repose fortement sur le statut des événements, donc la comparaison des dates n'est pas une option. Cela aurait du sens si le statut n'était demandé que quelques fois. La mise à jour sur demande est une option. Je vous remercie tous les deux. – JoaoPedro

Répondre

1

Je recommande la mise à jour du statut tout moment l'état est demandé. Ou mieux encore, ne stockez même pas le statut dans la base de données, mais il suffit de le calculer chaque fois qu'il est demandé en fonction des autres variables. Ainsi, chaque fois que vous avez une liste de table, le statut ou quelqu'un demande le statut, prenez simplement la date de l'événement, comparez-la à la date du jour et envoyez-les "non démarré", "en cours" ou "terminé".

À moins bien sûr vous avez besoin de plus statuts possibles (« planification », « préparation », « mise en place », etc.). Ensuite, vous auriez besoin de dates/d'heures planifiées pour chacun de ces statuts ou vous auriez besoin de stocker une variable d'état. De toute façon, vous pouvez mettre à jour le statut (selon la date d'aujourd'hui et toute autre information pertinente) au moment où il est demandé.

+0

Mise à jour sur demande est certainement le chemin à parcourir. Ne pas stocker le statut dans la base de données rendrait tout plus complexe. La liste des événements passés est une tâche courante dans l'application et cela prend beaucoup de temps chaque fois qu'une liste est demandée. Il y a trop de choses en fonction de l'état des événements. Merci quand même. – JoaoPedro

+0

@JoaoPedro, le fait qu'il y ait «trop de choses» selon l'état de l'événement ne justifie pas nécessairement le stockage de données supplémentaires dans la base de données - en fait au contraire; la plupart des systèmes de base de données sont liés aux E/S, ce qui signifie qu'ils attendent que les données soient lues/écrites dans le stockage et que l'ajout de colonnes inutiles et extrêmement peu coûteuses au mélange ralentirait normalement (!) le système. Pas beaucoup pour un seul champ (plus index), mais s'il est utilisé comme principe, alors il se cumule. – Unreason

0

Mise à jour à l'utilisateur dans l'enregistrement n'est pas très bonne idée car il ajoute trop de pression (s'il y a beaucoup d'utilisateurs). La meilleure façon de le faire serait d'exécuter un cronjob tous les soirs après 12 heures/ou au début de la journée. Si vous voulez conserver votre ancien code, enveloppez-le avec un code de date. pseudo ressemblera:

$updated_last = last modification time of the file "updated"; 
if($updated_last is more than 1 day) { 
update db; (your old code) 
touch file "updated"; 
} 
+0

Je pensais qu'un travail cron ne le ferait pas, car le statut de l'événement peut être demandé et changé à "plus de" quelques heures après la création de l'événement. Merci bien – JoaoPedro

+0

@JoaoPedro "le statut de l'événement peut être demandé et changé pour" sur "juste quelques heures après la création de l'événement". Est-ce que ce n'est pas la bonne opération? Avec un statut basé sur une date, le statut changera à minuit, ou ai-je oublié quelque chose? – Jaydee

0

Utilisez ce,

UPDATE events SET status = 'over' WHERE DATE(event_date) > NOW(); 

Exécuter tous les jours, une fois par jour, avec cron.

0

je partirais avec une tâche cron de minuit à moins que vous avez à traiter avec beaucoup de fuseaux horaires. Le recalcul semble plutôt inutile et le calcul à la demande peut devenir plutôt salissant du point de vue de la maintenance, car il laisse la base de données dans un état partiellement incorrect.

0

Chaque réponse accepte la raison de la MISE À JOUR. Cependant, permettez-moi de remettre en question cette décision en prolongeant la suggestion du colonel Srapnel à partir des commentaires.

mise à jour peut être considérée comme un gaspillage de ressources puisque vous pouvez le calculer sur la course avec en comparaison de la date de la mémoire (ce qui est des ordres de grandeur plus rapide que le stockage E/S).

Il y a deux approches à ceci: requête/vue

  • peut le faire (et le coût devrait vraiment être négligeable)
  • faire réellement ce côté php après les résultats sont récupérés (considérer une mise en forme/tâche de présentation)
  • il pourrait même se faire sur le côté client, qui, si possible, la performance serait sage être les meilleures solutions (cela pourrait conduire à des problèmes de maintenance/sécurité)

Bien sûr, il pourrait y avoir des raisons valables d'ignorer ces solutions, mais je pense que la performance en elle-même n'est pas suffisante (la plupart des DB sont liés aux E/S).

Questions connexes