Я создаю систему бронирования номеров. Для этого вопроса у меня две таблицы: 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;
}
Зачем обрабатывать сериализованный массив?
Похоже, вам нужно больше объектов, чем просто пользователей и групп.
Я бы сделал что-то вроде:
Бронирование будет иметь ассоциации со всеми тремя другими объектами, а также с датой и продолжительностью или что-то еще. Неясно, могут ли ваши пользователи принадлежать к нескольким группам (или изменить группы) - если они могут, то для каждого бронирования потребуется как набор пользователей, так и группа. Если нет, вы можете уйти с просто пользователем, так как это скажет вам, какая группа участвует.
Затем у вас есть все данные, необходимые для создания любых отчетов.
user
group
entry
(бронирование и запросы)room
иfloor
, среди других , которые я не думаю , поможет (token
,administrator
,equipment
). Считаете ли вы, что я должен просто посчитать количество часов от ссылок между [user
иentry
] или [group
иentry
] каждый раз, когда мне нужны данные? Это похоже на много математики - есть ли быстрый способ сделать это?