2009-08-25 8 views
0

J'écris une application qui affiche des messages, un peu comme un système de forum simple. Les messages peuvent être marqués comme urgents par les utilisateurs lorsqu'ils soumettent la publication, mais un modérateur doit approuver le statut "urgent". Une publication sera toujours affichée même si elle n'a pas été approuvée comme étant urgente, mais elle apparaîtra comme une publication normale jusqu'à ce que le modérateur approuve l'état d'urgence, auquel cas le post recevra un traitement spécial.meilleure approche mysql?

J'ai examiné deux approches pour cela:

1) ont deux drapeaux dans les tableaux de messages. Un pour dire que l'utilisateur a demandé un statut urgent, et un second pour indiquer si l'administrateur a approuvé le statut d'urgence. Seulement si les deux sont vraies sera le poste être montrer comme étant urgent.

2) avoir deux tables. Une demande table en attente qui contient toutes les approbations urgentes en attente. Une fois que l'administrateur a approuvé le statut d'urgence, je supprime la demande de la table en attente et met à jour la table des messages afin que le champ urgent devienne vrai pour ce message.

Je ne suis pas sûr si l'une ou l'autre approche est meilleure que l'autre.

La première solution signifie que je n'ai qu'une seule table à m'inquiéter, mais elle se termine avec plus de champs. Je ne sais pas si cela rend l'interrogation plus lente ou non, étant donné que la table des messages sera la table la plus demandée dans l'application.

La deuxième solution maintient la table des postes plus maigre mais annonce une autre table à traiter (pas que ce soit dur). Je penche pour la deuxième solution, mais je me demande si je ne suis pas en train d'analyser les hing et de rendre ma vie plus compliquée qu'elle ne devrait l'être. Conseil?

Répondre

1

Certainement 1). La table supplémentaire vient gâcher les choses. Un champ de statut supplémentaire suffit, avec des valeurs: 0 = normal, 1 = urgent_requested, 2 = urgent_approved par exemple.

Vous pouvez interroger avec status = 1 pour les requêtes nécessitant une approbation, et si vous commandez par état desc, vous obtenez naturellement les messages urgents à l'avance.

+0

Quelle bonne idée. La table posts stocke déjà le drapeau "urgent", mais de cette façon je peux plier la demande en attente dans le même champ. Merci. – nedlud

+0

Eh bien c'est exactement ce que j'ai suggéré: D semble être un peu mal compris .. Dans ma solution la 2ème table contient ce qu'il veut dire - c'est ce que vous avez écrit avec 0 = normla etc. –

+0

off: What a nick schizophrénique est NedLud sur un site lié à l'informatique! =) – Zed

1

Il y a une autre solution qui vient à l'esprit :)

Vous pouvez avoir une table avec des statuts de poste et dans votre table les messages que vous aurez une columnt qui fait référence à un statut ..

Cette apporach présente plusieurs avantages - Comme si vous pouviez ajouter plus de statuts dans le futur. Vous pouvez même avoir une autre table contenant des règles pour changer les statuts (workflow).

+0

J'aime cette idée, mais pour l'instant je vais aller avec l'option 1) qui semble être un favori dans les réponses jusqu'à présent. – nedlud

1

La deuxième approche est la plus propre en termes de conception, et elle finira probablement par utiliser moins d'espace disque. La première approche est moins «pure», mais du point de vue de la maintenance et du codage, c'est plus simple; par conséquent, j'irais avec cette approche.

En outre, c'est génial de voir quelqu'un penser à la conception avant de partir et écrire des tonnes de code. :) Je ne peux pas vous dire combien de projets foirés j'ai vu, où une seule heure de réflexion sur la conception aurait sauvé de nombreuses heures d'efforts pour tous les participants ...

1

Je pense que l'option 1 est le meilleur. La seule chose que vous devez faire est de faire un index avec les deux champs. L'option 2 ajoute trop de complexité

J'ai une requête mysql juste pour des choses comme ça.Je vais le poster dès que je me souviendrai/trouver la syntaxe correcte

+0

La voici. Cela fera que toutes les lignes avec flag = 1 iront en premier lieu, et ensuite tout sera trié par "datetime" ou n'importe quel champ que vous utiliserez ORDER BY CASE WHEN flag = 0 ALORS 0 ELSE 1 FIN, datetime –

+0

err, typo : remplacer les 0 par 1 et vice versa –

+0

Oh, sympa. Merci :) – nedlud

Questions connexes