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;
}
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
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
@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