tl;博士关于处理数据库数据和设计的一般问题:
在某个时间点从其他数据中派生数据是否可以接受/是否有任何缺点,然后将该派生数据存储到单独的表中以保留该特定时间的值历史记录,或者,如果您从不存储从其他数据派生的数据,而是仅在需要时从现有数据中派生所需数据?
我的具体情况:
我们有一个数据库,我们在其中记录人们的假期和假期状态。我们跟踪他们还剩多少天,他们花了多少天,诸如此类。
一项设计要求发生了变化,现在要求我能够显示一个人在任何给定年份的 12 月 31 日还剩下多少天。所以我需要能够说,“鲍勃在 2010 年 12 月 31 日还剩 14 天”。
我们可以通过两种方式做到这一点:
一个 SQL Server 代理作业,它在 12 月 31 日捕获当时每个人的剩余天数,并将它们插入到类似“YearEndHistories”的表中,该表将包含您当时的 EmployeeID、Year 和 DaysRemaining。
我们不保留 YearEndHistories 表,但是如果我们想找出在某个时间拥有的天数,我们会循环遍历在该特定时间之前存在的所有添加和减去的假期。
我喜欢 #1 带来的确定感 --- 记录的值将由管理部门审查,并且不会争论或改变该数字的可能性。使用 #2,我喜欢效率 --- 需要维护的表少了,并且实际表中不存在派生数据。但是我有一种奇怪的恐惧,担心一些看不见的错误会溜走,人们的历史价值计算会开始搞砸等等。2020年我不想处理,“我以9.5天结束2012,而不是9.0!我的半天去哪儿了?!”
我们已经决定的一件事是不能修改前几年的值。这意味着永远不可能回到上一个日历年并添加假期或类似的东西。年末的值就是THE值,不管过去有没有过错。如果发现错误,将通过奖励或减去当年的休假时间来弥补。