2017-04-19 21 views
2

我需要一些來自數據庫人員的建議。如果我有這樣的數據庫表:在數據庫表中使用匯總列是常見的還是很好的形式?

EVENT 
Id 
Name 
StartDateTime 
EndDateTime 

這將是確定要包括在表的彙總列將包含事件的秒(的startDateTime和EndDateTime秒),時間:

EVENT 
Id 
Name 
StartDateTime 
EndDateTime 
DurationInSeconds <--- 

我知道這將需要額外的存儲空間,但隨着表格變得非常大(數千萬行),在運行時計算此持續時間將變得相當昂貴。

我希望遵循「最佳實踐」,但也不希望因「沒有廉價」格式(性能方面)而導致數據無法使用。

你會怎麼做?


如果它的事項,我使用SQL Server 2014

+3

當然這是有道理的。更好的辦法是創建一個持久的計算列。這樣,它將計算數據更改時的值,並且不需要一直計算它。 https://technet.microsoft.com/en-us/library/ms191250.aspx –

+1

它只取決於使用情況。如果你打算對它進行大量搜索,也許你可以存儲它。 –

+0

您是否考慮使用索引? – Jprada

回答

3

這裏是你的樣品信息計算列的例子。

create table MyEvents 
(
    ID int 
    , Name varchar(20) 
    , StartDateTime datetime 
    , EndDateTime datetime 
    , DurationInSeconds as datediff(second, StartDateTime, EndDateTime) PERSISTED 
) 


insert MyEvents 
select 1 
    , 'Event 1' 
    , getdate() 
    , dateadd(minute, 3, getdate()) 

select * 
from MyEvents 
1

當談到數據庫設計時,術語「最佳實踐」被濫用。問題在於,對於很多人來說,「最佳實踐」等於「做聰明人做的事」,而不是學習聰明人學習的東西。

對於任何重大的設計問題,都會有多種令人滿意的設計,儘管有些設計會比其他設計更令人滿意。就你而言,這不會是一種災難。在更大的方案中,存儲空間和處理時間的差異會很小。正如幾位評論指出的那樣,最適合你的工作取決於你對數據的使用。

這裏有幾件事值得注意。

如果您將持續時間作爲單獨的列存儲,那麼您將面臨一些不小心的更新程序將更改事件結束時間的風險,並忘記相應地更改持續時間。這在一個編程良好的應用程序中不太可能發生,但如果您偶爾通過交互式SQL進行修復,則駕駛艙錯誤可能會導致此類不一致。

如果您計算檢索時間的持續時間,並且許多不同的程序員對此計算進行編碼,那麼您將面臨其中一個不知道如何計算兩個時間戳之間差異的風險。

可能最好的折中是計算列。然而,它可能是最好的存儲開始時間和持續時間,並讓結束時間爲計算值。這又取決於你對數據做了什麼。

相關問題