2011-08-30 4 views
2

Quelle est la méthode «correcte» (la plus normalisée?) Pour stocker des demandes dans la base de données? Par exemple, un utilisateur soumet un article. Cet article doit être examiné et approuvé avant d'être publié sur le site.Comment stocker correctement les requêtes dans une base de données MySQL (ou toute autre)

Quelle est la façon plus appropriée:

A) le stocker dans dans les articles table avec un champ "approuvé" qui est soit un 0, 1, 2 (nié, approuvé, dans l'attente)

B) Avoir une table ArticleRequest qui a les mêmes champs que les articles, et lors de l'approbation, déplacer les données de la ligne à partir des demandes d'articles aux articles.

Merci!

+3

Je me porterais garant de A. – Shef

+0

Je vote pour l'option A: De cette façon, vous pouvez implémenter "supprimé", "marqué" (comme spam etc) et ainsi de suite facilement. Déplacer une rangée de TableA à TableB pourrait mal tourner, se terminant avec deux articles ou aucun. –

Répondre

4

Étant donné que chaque article doit avoir un statut d'approbation, et chaque fois qu'un article est demandé, il est très probable que vous ayez besoin de connaître ce statut - gardez-le en ligne avec la table. Toutefois, pensez à appeler le champ ApprovalStatus, par contre. Vous pouvez ajouter une table associée pour contenir chacun des statuts, à moins qu'ils ne changent très souvent (ou jamais).

EDIT: Raisons pour garder les champs dans les tables connexes sont:

  • Si le domaine connexe n'est pas toujours applicable, ou peut souvent être null.
  • Si le champ associé n'est nécessaire que dans de rares cas, il est mieux décrit en utilisant une clé étrangère dans une table associée d'attributs associés.

Dans votre cas, les raisons ci-dessus ne s'appliquent pas.

+0

+1 pour le nom du champ. –

+0

Mon problème avec le choix A est que chaque fois que vous faites une instruction SELECT pour sélectionner et afficher le (s) article (s), vous devez vérifier que ApprovalStatus est marqué comme approuvé.Si vous faites le choix B, tous les articles de la table Articles sont approuvés, et tous ceux qui ne figurent pas dans ce tableau ne sont pas approuvés. –

+0

@John: Point valide, mais c'est une étape simple pour ajouter une clause 'WHERE' avec' ApprovalStatus = 1' (où '1' est" approuvé ") ... vous pouvez même créer une vue nommée' ApprovedArticles' pour encapsuler cette logique. – Yuck

1

Je pense qu'il est préférable de stocker des données dans la table principale avec un statut spécifique. Parce qu'il n'est pas nécessaire de déplacer les données entre les tables si celle-ci est approuvée et que l'article apparaîtra sur le site en même temps. Si vous ne souhaitez pas stocker les articles refusés, vous devez créer un script cron qui supprimera les données inutiles ou les déplacera vers la table d'archivage. Dans ce cas, vous aurez moins de chargement de votre db parce que vous pouvez ajuster le temps approprié pour enlever les vieux articles par exemple la nuit. Concernant le problème d'utilisation du statut d'approbation dans chaque requête: Si vous envisagez d'avoir un site très populaire avec une charge élevée pour chercher ou faire une liste d'article vous utiliserez un serveur autonome comme sphinx ou solr (mysql n'est pas une bonne solution pour cela fins) et vous allez mettre des données à ceux-ci avec status = 'Approuvé'. L'utilisation de l'indexation delta vous aide à garder vos données à jour.

2

Faites certainement «A». Si vous faites B, vous allez créer une nouvelle table avec les mêmes champs que l'autre et cela signifie que vous faites quelque chose de mal. Vous vous répétez.

Questions connexes