2011-08-31 5 views
0

J'ai les conditions suivantes pour une feuille de temps dans une application web:Base de données: meilleure façon de modéliser ces exigences?

  • Les utilisateurs peuvent créer des entrées
  • entrées ne peuvent être créées et modifiées dans le mois en cours et dans le dernier mois si elle n » t "fermé".
  • Un mois se ferme automatiquement le dixième jour du dernier mois ou plus tôt si un utilisateur choisit manuellement de le faire.

Actuellement, j'ai les tables utilisateur et l'entrée avec les attributs suivants:

utilisateur:

  • id
  • Nom

Entrée:

  • id
  • userid
  • Date
  • starttime
  • endtime
  • notes

La question est: Quelle est la meilleure façon de modéliser mes besoins dans la base de données? Mon idée est d'ajouter un champ booléen "lastMonthIsClosed" à la table User et de planifier un travail mensuel qui définit le champ à true pour tous les utilisateurs le dixième jour de chaque mois et à false pour tous les utilisateurs le premier jour de chaque mois. Alternativement, il pourrait également être un champ de date "lastClosedMonth" ...

Je me demande s'il existe une approche plus élégante pour modéliser ces exigences?

Répondre

0

"Fermé" n'est pas un attribut d'un utilisateur ou d'un mois. C'est un attribut d'une entrée.

create table entry (
    id integer primary key, 
    userid integer not null, 
    start_time timestamp not null, 
    end_time timestamp not null default current_timestamp 
    CHECK(start_time < end_time), 
    notes varchar(255), 
    closed boolean not null default FALSE 
); 

Tenez compte de contraintes supplémentaires sur la durée.

  • Doit être supérieur à 1 minute.
  • Doit être d'au moins 6 minutes. (Un dixième d'heure.)
  • Doit être inférieur à 9 heures.
  • Doit être inférieur à 24 heures.

Vous pouvez créer une vue pour exposer uniquement les entrées ouvertes aux utilisateurs.

Ajoutez un row-level BEFORE UPDATE trigger à cette table pour empêcher les modifications apportées aux entrées fermées. Le déclencheur empêchera les utilisateurs et les administrateurs de base de données de modifier une entrée fermée. Un déclencheur BEFORE INSERT au niveau de la ligne peut empêcher les utilisateurs et les administrateurs d'insérer une ligne en fonction de ses horodatages.Décidez maintenant quoi faire des délais qui chevauchent le changement d'un mois à l'autre.

+0

Merci pour votre réponse! Qu'en est-il de la restriction à la création de nouvelles entrées? Si "closed" est un attribut d'une entrée, alors il est possible d'empêcher l'édition d'entrées existantes (en plaçant closed à true) mais comment empêcher la création de nouvelles entrées au cours du dernier mois? Aussi, est-il vraiment logique que «fermé» soit un attribut d'entrée? Il sera réglé sur une base mensuelle de toute façon ... il n'est pas possible de fermer juste quelques articles dans un mois, c'est tout ou rien. –

+0

Voir ci-dessus: "déclencheur BEFORE INSERT au niveau de la ligne". Je pense qu'il est logique de considérer «fermé» comme un attribut d'entrée. "Fermer un mois" signifie vraiment "fermer un mois d'entrées". Et un jour, on vous dira probablement quelque chose comme: «Heinrich fait l'objet d'une enquête pour détournement de fonds et entrave à la justice, et il ferme toutes ses entrées entre le quatrième et le douzième jour de ce mois. –

+0

Vous avez raison, cela a du sens. Cependant, je ne comprends toujours pas complètement votre solution. Disons que j'ai trois entrées: a, b, c a et b sont dans le dernier mois, c est dans le mois en cours, aujourd'hui est le cinquième jour du mois. Maintenant, l'utilisateur décide de fermer les entrées du dernier mois, donc je marque les entrées a et b comme "fermées". Comment puis-je déterminer qu'aucune entrée ne peut être insérée avec une date au cours du dernier mois? Que devrait faire ou vérifier le déclencheur susmentionné? En fonction de l'horodatage, vous pouvez insérer l'entrée car le jour du mois en cours est <= 10 (voir les conditions ci-dessus). –

Questions connexes