【问题标题】:Best way to keep user history保留用户历史记录的最佳方法
【发布时间】:2011-10-23 15:52:45
【问题描述】:

我正在创建一个房间预订系统。为了这个问题,我有两个表: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 两个表中生成一个长文本列(数组是序列化的),这将被大量提取,总体而言,使用很少。

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


    【解决方案1】:

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

    听起来您需要更多的实体,而不仅仅是用户和组。

    我会这样做:

    • 用户
    • 房间
    • 预订

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

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

    【讨论】:

    • 是的。我实际上有usergroupentry(预订和请求)roomfloor,其中我认为不会有帮助(tokenadministratorequipment)。你认为每次我想要数据时我应该只计算 [userentry] 或 [groupentry] 之间的链接的小时数吗?这似乎涉及很多数学问题——有没有快速的方法?
    • 我同意 - 这里的某个地方应该是房间被预订的日期......然后运行聚合函数。
    • @Daniel - 是的,您需要编写一些使用您的实体的例程,也许还有一些自定义 DQL 查询来获取您需要的数据。如果其中一些例程很慢,请开始考虑缓存结果的方法。您需要在某个时候进行数学运算,因此您不妨编写可靠的代码来为您做数学题。
    • 好的。我写了以下例程。缓存它的好主意——我并没有想得那么远,因为我仍然不确定我是否可以在生产服务器上安装 APC。无论如何,这里有一个函数:
    • 您不需要 APC - 您可以使用您的数据库,或带有序列化数据的平面文件,或其他任何东西。这个想法是避免每次有人拉报告时都必须从头开始计算所有内容。但最好的方法是不要过早优化。编写例程以从头开始烘焙您的报告,然后弄清楚如何在这些例程开始导致问题的地方存储/使预先计算的数据无效。
    猜你喜欢
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多