2011-08-09 23 views
0

我正在創建一個房間預訂系統。爲了這個問題,我有兩個表格:usergroup。它們通過多對多的關係在Doctrine2中相互關聯(所以技術上我有3個表格)。保持用戶歷史的最佳方式

每週,每組允許預訂10個小時。任何成員都可以代表該組進行預訂。我希望能夠保留用戶和組的預訂歷史記錄。所以我們可以說

"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; 
} 

回答

4

爲什麼處理序列化的陣列?

聽起來像你需要更多的實體,而不僅僅是用戶和組。

我會做這樣的事情:

  • 用戶
  • 客房
  • 預訂

一個預訂必須與所有其他三個實體協會,以日期時間一起&持續時間,或其他。目前尚不清楚您的用戶是否可以屬於多個組(或更改組) - 如果可以,則每個預訂都需要用戶和組設置。如果不是這樣,那麼只需要用戶就可以逃脫,因爲這會告訴你什麼組參與。

然後,你有你需要的所有數據來生成你想要的任何報告。

+0

是的。我實際上有'user'' group'' entry'(預訂和請求)'room'和'floor',其中我認爲不會有幫助的('token','administrator','equipment')。你是否認爲我應該只在每次我想要數據時,從['user'和'entry']或['group'和'entry']之間的鏈接中計算小時數?這看起來像很多數學 - 有沒有一種快速的方法來做到這一點? – Daniel

+0

我同意 - 在這裏的某個地方是房間預訂日期..然後只是運行聚合函數。 – Randy

+0

@Daniel - 是的,您需要編寫一些例程來使用您的實體,也許還有一些自定義的DQL查詢來獲取您需要的數據。如果其中一些例程很慢,請開始考慮緩存結果的方法。你需要在某個時候進行數學運算,所以你不妨寫出可靠的代碼來爲你做。 – timdev