tl;关于处理数据库数据和设计的一般问题:
是否可以接受/在某个时间点从其他数据派生数据是否有任何缺点,然后将该派生数据存储到单独的表中以便在该特定时间保留值的历史记录,或者,应该您从不存储从其他数据派生的数据,而是仅在您需要时从现有数据中获取所需数据?
我的具体情况:
我们有一个数据库,用于记录人们的休假日和休假日状态。我们会跟踪他们离开的天数,他们已经过了多少天以及类似的事情。
一项设计要求已经改变,现在要求我能够显示一个人在任何一年的12月31日离开的天数。所以我需要能够说,“鲍勃在2010年12月31日还剩14天了。”
我可以通过以下两种方式做到这一点:
一个SQL Server代理作业,它在12月31日捕获当时每个人的剩余天数,并将它们插入到像“YearEndHistories”这样的表中,这将使您的EmployeeID,Year和DaysRemaining处于该状态时间。
我们没有保留YearEndHistories表,但是如果我们想要找出某个时间所拥有的天数,我们会遍历在特定时间内存在的所有添加和减去的假期。 / p>
我喜欢#1带来的确定感 - 记录的值将由主管部门审核,并且没有关于该数字变化的争论或可能性。对于#2,我喜欢效率---维护一个较少的表,并且实际表中没有派生数据。但我对一些看不见的虫子滑倒有一种奇怪的恐惧,人们的历史价值计算开始搞砸了什么。在2020年,我不想处理,“我在2012年结束了9.5天,而不是9.0!我的半天去了哪里?!”
我们决定的一件事是,以前几年不可能修改价值观。这意味着永远不可能回到上一个日历年并添加休假日或类似的事情。无论过去是否存在错误,年末的价值均为THE值。如果发现错误,将通过奖励或减去当年的休假时间来平衡。
答案 0 :(得分:4)
是的,这是可以接受的,特别是如果计算很复杂或频繁调用,或者不经常变化(例如:游戏中的高分表 - 它经常被查看,但内容只会随着日益变化而变化很少见的情况下,一个球员做得很好。)
作为一般规则,我会尽可能地规范化数据,然后在出于性能原因的必要时添加派生字段或表格。
在您的情况下,计算似乎相对简单 - 授予员工休假日的总和 - 天数,但这取决于您。
顺便说一下,我鼓励你在涉及数据时不要考虑“循环” - 尝试将数据作为一个整体来考虑。像
这样的东西SELECT StaffID, sum(Vacation)
from
(
SELECT StaffID, Sum(VacationAllocated) as Vacation
from Allocations
where AllocationDate<=convert(datetime,'2010-12-31' ,120)
group by StaffID
union
SELECT StaffID, -Count(distinct HolidayDate)
from HolidayTaken
where HolidayDate<=convert(datetime,'2010-12-31' ,120)
group by StaffID
) totals
group by StaffID
答案 1 :(得分:0)
在我看来,派生数据就像一个传递依赖,在规范化中可以避免。 这是一般规则 在你的情况下,我会选择#1,它会给你一个更好的“可审计性”,而不会造成性能损失。