2017-04-19 23 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进行修复,则驾驶舱错误可能会导致此类不一致。

如果您计算检索时间的持续时间,并且许多不同的程序员对此计算进行编码,那么您将面临其中一个不知道如何计算两个时间戳之间差异的风险。

可能最好的折中是计算列。然而,它可能是最好的存储开始时间和持续时间,并让结束时间为计算值。这又取决于你对数据做了什么。

相关问题