2011-08-09 4 views
0

Je crée un système de réservation de chambres. Pour le plaisir de cette question, j'ai deux tables: user et group. Ils sont liés dans Doctrine2 via une relation many to many (donc techniquement j'ai 3 tables).Meilleure façon de conserver l'historique des utilisateurs

Chaque semaine, chaque groupe est autorisé à réserver dix heures. Toute personne membre d'un groupe peut réserver au nom de ce groupe. Je veux être en mesure de conserver un historique des réservations des utilisateurs et des groupes. On peut donc dire

"2 weeks ago, the "white lions" booked nine and a half hours, but the week before, they only booked 3", 

et nous pouvons aussi dire

"Dave has made 75% of the bookings for the white lions in the past two weeks" 

Idéalement, je veux être en mesure de créer des graphiques avec cette histoire, aussi.

Quelle est la meilleure façon de faire cela? Je pensais que pour group je mettrais un tableau de semaines triées par numéro de semaine ISO et l'année en tant que clés de tableau, et chaque clé donnerait une valeur du nombre d'heures que les groupes ont réservé cette semaine. La même chose pourrait aller pour user. Mais cela génère une colonne longtext (tableau est sérialisé) dans les deux tables user et group, qui seront beaucoup récupérées et, dans l'ensemble, très peu utilisées.

J'utilise MySQL.

Que pensez-vous?

EDIT: j'ai écrit une fonction d'agrégation et je veux juste faire en sorte que ce soit le genre de chose dont nous parlons:

function getGroupHoursPerWeek(Group $group , $sometime_during_week = null) { 
global $em; 
if(!is_null($sometime_during_week)) { 
    $year = date("o", $sometime_during_week); 
    $week_number = date("W", $sometime_during_week); 
} else { 
    $year = date("o"); 
    $week_number = date("W"); 
} 
$week_start = strtotime($year . "W" . $week_number); 
$one_week_seconds = 3600 * 24 * 7; 
$week_end = $week_start + $one_week_seconds; 
$total_time = 0; 

$query = $em->createQuery("SELECT e.start_time, e.end_time FROM SSMURBS\Entry e 
          JOIN e.group g 
          WHERE g.id = {$group->id} 
          AND e.start_time > $week_start 
          AND e.end_time < $week_end 
          AND e.status != " . ENTRY_STATUS_REJECTED); 
$entry_times = $query->getScalarResult(); 

foreach($entry_times as $entry_time) { 
    $total_time += ($entry_time["end_time"] - $entry_time["start_time"]); 
} 
return $total_time/3600; 
} 

Répondre

4

Pourquoi faire affaire avec un tableau sérialisé?

Il semble que vous ayez besoin de plus d'entités que d'utilisateurs et de groupes.

je ferais quelque chose comme:

  • utilisateurs
  • Groupes
  • Chambres
  • réservations

Une réservation aurait des associations avec les trois autres entités, ainsi que datetime & durée, ou quelque chose. Il n'est pas clair si vos utilisateurs peuvent appartenir à plus d'un groupe (ou changer de groupe) - s'ils le peuvent, chaque réservation nécessiterait à la fois un ensemble d'utilisateurs et de groupes. Sinon, vous pouvez vous en sortir avec l'utilisateur, car cela vous indiquera quel groupe est impliqué.

Ensuite, vous avez toutes les données dont vous avez besoin pour générer les rapports que vous voulez.

+0

Oui. J'ai en fait 'user'' group' 'entry' (réservations et demandes)' room' et 'floor', parmi d'autres que je ne pense pas pouvoir aider (' token', 'administrator',' equipment'). Pensez-vous que je devrais juste compter le nombre d'heures à partir des liens entre ['user' et' entry'] ou ['group' et' entry'] chaque fois que je veux les données? Cela semble beaucoup de maths - y a-t-il un moyen rapide de le faire? – Daniel

+0

je suis d'accord - quelque part ici shuold être les dates de la salle a été réservée .. alors il suffit d'exécuter des fonctions agrégées. – Randy

+0

@Daniel - oui, vous voudrez écrire des routines qui utilisent vos entités et peut-être quelques requêtes DQL personnalisées pour récupérer les données dont vous avez besoin.Si certaines de ces routines sont lentes, commencez à réfléchir aux moyens de mettre en cache les résultats. Vous devez faire le calcul à un moment donné, alors vous pourriez aussi bien écrire du code solide pour le faire pour vous. – timdev

Questions connexes