Лучший способ сохранить историю пользователей

0

Я создаю систему бронирования номеров. Для этого вопроса у меня две таблицы: user и group. Они связаны в Doctrine2 через отношение многих к многим (так что технически у меня есть 3 таблицы).

Каждую неделю каждой группе разрешается забронировать десять часов. Любой, кто является членом группы, может забронировать от имени этой группы. Я хочу иметь возможность сохранять историю бронирования как пользователей, так и групп. Поэтому мы можем сказать

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

и мы также можем сказать

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

В идеале, я хочу иметь возможность создавать графики с этой историей.

Каков наилучший способ сделать это? Я думал, что для group я бы поставил целый ряд недель, отсортированных по номеру и году недели ИСО в виде ключей массива, и каждый ключ дал бы ценность того, сколько часов группы забронировали на этой неделе. То же самое можно сделать для user. Но это генерирует столбец longtext (массив сериализуется) как в user и в group таблицах, которые будут извлекаться очень часто и, в целом, очень мало используются.

Я использую MySQL.

Что ты думаешь?

EDIT: я написал агрегатную функцию, и я просто хочу убедиться, что это то, о чем мы говорим:

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;
}
Теги:
data-structures
database-design
doctrine2

1 ответ

4
Лучший ответ

Зачем обрабатывать сериализованный массив?

Похоже, вам нужно больше объектов, чем просто пользователей и групп.

Я бы сделал что-то вроде:

  • пользователей
  • группы
  • Номера
  • Бронирование

Бронирование будет иметь ассоциации со всеми тремя другими объектами, а также с датой и продолжительностью или что-то еще. Неясно, могут ли ваши пользователи принадлежать к нескольким группам (или изменить группы) - если они могут, то для каждого бронирования потребуется как набор пользователей, так и группа. Если нет, вы можете уйти с просто пользователем, так как это скажет вам, какая группа участвует.

Затем у вас есть все данные, необходимые для создания любых отчетов.

  • 0
    Да уж. Я на самом деле у user group entry (бронирование и запросы) room и floor , среди других , которые я не думаю , поможет ( token , administrator , equipment ). Считаете ли вы, что я должен просто посчитать количество часов от ссылок между [ user и entry ] или [ group и entry ] каждый раз, когда мне нужны данные? Это похоже на много математики - есть ли быстрый способ сделать это?
  • 0
    я согласен - где-то здесь должны быть даты, когда комната была забронирована .. затем просто запустите агрегатные функции.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню