保持用户历史记录的最佳方式

时间:2011-08-09 23:03:09

标签: mysql sql database-design data-structures doctrine-orm

我正在创建一个房间预订系统。为了这个问题,我有两个表:usergroup。它们在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也是如此。但是这会在usergroup表中生成一个longtext列(数组被序列化),这些列将被大量获取,并且总体上使用很少。

我正在使用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;
}

1 个答案:

答案 0 :(得分:4)

为什么要处理序列化数组?

听起来你需要的不仅仅是用户和群体。

我会做类似的事情:

  • 用户
  • 群组
  • 客房
  • 预订

预订将与所有其他三个实体建立关联,以及日期时间和日期。持续时间等等。目前尚不清楚您的用户是否可以属于多个组(或更改组) - 如果可以,则每次预订都需要用户和组。如果没有,您可以只使用用户,因为这将告诉您涉及哪个组。

然后,您拥有生成所需报告所需的所有数据。