2015-10-13 103 views
0

我有一個MySQL數據庫與表稱爲event_table看起來像這樣數據庫設計與事件的開始和結束時間

var Schema = { 
    event_start: DataTypes.DATE, 
    event_end: DataTypes.DATE 
} 

現在,當我想查詢現有的事件,我可以做

SELECT * FROM event_table WHERE event_end >= curdate() and event_start <= curdate() 

我正在考慮添加一個名爲if_existing_event的字段並編寫一個小程序,每隔一段時間運行一次,並將true或false分配給此字段。因此,在未來我能簡化查詢成爲

SELECT * FROM event_table WHERE if_existing_event = true; 

有沒有一種方法,我可以設置一個觸發或做一些與數據庫來實現這一目標?這是簡化查詢的推薦方式嗎?

+0

你寫了mysql,但爲sql-server-triggers添加了一個標籤。 SQL服務器支持您可以用於此目的的計算列,我不知道關於MySQL。 –

+0

我意識到我可以使用ORM(例如sequelize)來生成虛擬字段getter和setter來實現這一點,而不是真正的字段。也許我根本不需要觸發器或程序更新? –

回答

1

一個事件是否存在是一個派生值,它是從event_start date和event_end date派生而來的。根據規範化規則,特別是第三範式,派生值應該從表中刪除。

但是,如果它能帶來可觀的性能收益,則可以進行去歸一化。然而,在你的情況下,因爲它只是一個比較少,也只有當第一個子句'event_end> = curdate()'爲真時,纔不會失去標準化的好處。

+0

ya。只是認爲它可能會更容易查詢正確的東西,而不會丟失未來的東西或其他人正在處理它.. –

1

「每過一段時間」多久?假設您查詢當前事件並且大量事件從現在起五分鐘結束。那麼如果你從現在開始十分鐘之後再次購買,他們仍然很有可能會出現。最好的設計會在結果集不再是最新的時刻從結果集中移除事件。

您在第一次查詢中提供瞭解決方案。使這個定義成爲一個叫做哦的視圖,如Current_Events。然後查詢

select * from current_events; 

將只返回當前事件。不會顯示在執行查詢之前停止的僅爲毫秒的事件。

我是一個很好的用戶的意見。對於大多數主要表格我都不會有幾十個視圖。這極大地簡化了應用程序查詢。

select * 
from ViewThatPresentsDataJustTheRightWay; 
+0

只是有多個查詢條件,如日期,used,used_by等,所以如果我不不會想出那些虛擬領域的機會,我可能會錯過我不知道的東西.. –

+0

但無論如何,我認爲我可以使用ORMs來想出虛擬領域的吸氣劑和制定者,並且它比創建新的管理更容易字段我想.. –

相關問題