【发布时间】:2011-10-23 15:52:45
【问题描述】:
我正在创建一个房间预订系统。为了这个问题,我有两个表: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,我会将一个按 ISO 周数和年份排序的周数组作为数组键,每个键都会给出该周团体预订小时数的值。 user 也是如此。但这会在user 和group 两个表中生成一个长文本列(数组是序列化的),这将被大量提取,总体而言,使用很少。
我正在使用 MySQL。
你有什么想法?
编辑:我写了一个聚合函数,我只是想确保这是我们正在谈论的那种事情:
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;
}
【问题讨论】:
标签: mysql sql database-design data-structures doctrine-orm