2010-09-28 109 views
0

我有一個包含事件信息的MYSQL表。我需要一種機制,根據它的日期更新每個事件的狀態(如果它過去的日期是「over」)。 做這樣的事情最好的辦法是什麼?更新任何用戶登錄時的事件狀態(對大多數用戶而言無用的例程),創建某種內部任務(如cron作業?)或任何其他方式。 現在,只有當創建者登錄時,事件的狀態纔會更新。這可以工作,但是另一個用戶會將事件視爲「已計劃」,直到創建者登錄,即使日期已過。順便使用PHP。謝謝根據日期自動更新MYSQL表

+1

當請求事件時更新它。 – 2010-09-28 13:48:01

+2

日期是唯一的標準?那你爲什麼要更新任何東西?使用一些日期算術代替例如比較日期值與現在()。 – VolkerK 2010-09-28 15:27:23

+0

這是一個很好的觀點,但應用程序嚴重依賴於事件狀態,因此不斷比較日期不是一種選擇。如果狀態僅被請求了幾次,這將是有意義的。根據要求更新是一個選項。我感謝你們倆。 – JoaoPedro 2010-09-28 15:52:38

回答

1

我建議任何時候狀態請求時更新狀態。或者更好的是,根本不要將狀態存儲在數據庫中,而只是根據其他變量在每次請求時計算它。這樣,無論何時你有一個表格列表狀態或某人請求狀態,只需將事件日期,與今天的日期進行比較,並將它們發送到「未開始」,「正在進行」或「結束」。

除非你需要更多可能的狀態(「計劃」,「準備」,「設置」等)。然後,您需要爲這些狀態中的每個狀態計劃日期/時間,否則您需要存儲狀態變量。無論哪種方式,您都可以在請求時更新狀態(根據當天的日期和任何其他相關信息)。

+0

根據要求更新是絕對要走的路。不將數據存儲在數據庫中會使一切變得更加複雜。列出過去的事件是應用程序中的常見任務,每次請求列表時都需要進行大量處理。有很多事情取決於事件的狀態。不過謝謝。 – JoaoPedro 2010-09-28 23:13:13

+0

@JoaoPedro,根據事件狀態存在「太多東西」的事實並不一定證明在DB中存儲額外的數據是正確的 - 實際上恰恰相反;大多數數據庫系統都是I/O綁定的,這意味着他們正在等待數據被讀取和寫入存儲器,並且向混合中添加額外的不必要和非常便宜的可計算列將通常減慢(!)系統。對於單個領域(加上索引)而言不是太多,但如果作爲一個原則來使用,那麼它會疊加起來。 – Unreason 2011-01-31 15:37:53

0

在用戶登錄時更新並不是一個好主意,因爲它增加了太多的壓力(如果有很多用戶)。做到這一點的最佳方式是在上午12點以後或每天開始時每天晚上運行cronjob。如果你仍然想保留你的舊代碼,然後用日期代碼包裝它。 僞看起來像:

$updated_last = last modification time of the file "updated"; 
if($updated_last is more than 1 day) { 
update db; (your old code) 
touch file "updated"; 
} 
+0

我認爲cron工作不會這樣做,因爲活動狀態可能會被請求,並在事件創建後的幾個小時內更改爲「over」。謝謝 – JoaoPedro 2010-09-28 23:18:06

+0

@JoaoPedro「事件狀態可能會被請求,並在事件創建後的幾個小時內變爲」結束「。這不正確的操作?基於日期的狀態,午夜狀態會改變,還是我錯過了什麼? – Jaydee 2010-09-29 08:15:12

0

使用此,

UPDATE events SET status = 'over' WHERE DATE(event_date) > NOW(); 

運行它的每一天,每天一次,用cron

0

除非你必須處理很多時區,否則我會選擇午夜cron作業。重新計算似乎相當浪費,並且從維護角度來看,按需計算可能會變得相當混亂,因爲它會使數據庫處於部分不正確的狀態。

0

每個答案接受你的更新理由。 但是,讓我質疑這個決定,並延續了Srapnel上校的意見。

更新可以被視爲浪費資源,因爲您可以在內存日期比較(這比存儲器的I/O更快的數量級)上計算它。

有兩種方法可供選擇:

  • 查詢/視圖可以做到這一點(和成本確實應該忽略不計)
  • 其實這樣做對PHP端結果檢索後(認爲這是一個格式/演示任務)
  • 它甚至可以在客戶端,其中如果可能的話,性能方面將是最好的解決方案做了(這可能導致維護/安全問題)

當然,可能存在忽略這些解決方案的正當理由,但我認爲其本身的性能還不夠(大多數數據庫都是I/O綁定的)。