一般情况下,最好是在数据库中存储带有预先计算值的原始数据,如果我在使用预先计算的值显示的情况下删除或删除行,则最好将数据库保持为最新状态。用户
OR
最好是存储原始数据并在运行中计算正确的显示值吗?
一个例子(与我的项目相关)将类似于以下内容:
你有一个计时器应用程序。在我的情况下,它使用核心数据。它没有连接到网络,而是一个在计算机或移动设备上运行的独立应用程序(用户可以选择)。该应用程序存储原始开始时间和原始结束时间。应用程序需要显示事件的持续时间和事件发生的时间间隔。是否更好地存储预先计算的“持续时间”时间,甚至是用于输出的预先格式化的持续时间字符串,或者更好地计算动态持续时间,可以说,显示?
与间隔相同,尽管涉及另一层,因为当我在数据库中创建/删除/更新行时,我将更新受此影响的项目的间隔。或者,在应用程序执行时计算是否更好?
为了记录,我不打算进行微观优化。我试图找出减少我必须维护的代码量的最佳方法。如果性能因此而提高,那就这样吧。
思想?
答案 0 :(得分:4)
通常,您可能希望避免DB中的计算值(来自现有列/表),除非分析绝对指示它们是必要的(即,DB表现不佳或者负载很大都放在服务器上) )。对于数据格式化来说更是如此,这几乎总是在客户端执行,而不是浪费数据库服务器周期。
当然,任何绝对必须执行计算的数据都应存储在数据库中。
当您谈到减少需要维护的代码量时,请记住DBA也需要维护存储过程代码和表模式。将维护责任从开发人员转移到DBA并不是在消除工作,而是在改变它。
最后,数据库更改通常会级联到许多应用程序,而应用程序更改只会影响该应用程序。
答案 1 :(得分:3)
我将计算值存储在数据库中的唯一时间是出于历史目的而需要它。你会在会计软件中一直看到这一点。
例如,如果我正在处理发票,我通常会保存计算的发票总额,因为以后计算总额的方式可能会发生变化。
我有时也会使用视图在数据库服务器上执行实际计算。
与其他许多事情一样,“它取决于”。对于您描述的情况,我倾向于将计算保留在代码中。如果确实选择使用数据库,则应使用视图动态计算而不是放入静态值。更改开始时间或结束时间以及忘记更改持续时间的风险太高,否则:) :)
答案 2 :(得分:0)
这实际上取决于您想要保持纯净(保持数据清洁)或快速。桌面上的计算容量有助于纯度,高速内核和大容量内存空间使得大型数据集可以实现表格单元格的字符串组合。
然而,在手机上,iPhone 4甚至在一组1000个物体上为UITableViewCell计算单个NSString需要相当长的时间,这会影响您的用户体验。
因此,调整用例的余额。持续时间听起来不会改变,所以我会预先计算并存储持续时间和显示字符串(从DBA的角度来看感觉很糟糕,但它会在手机上快速呈现)。
对于间隔,听起来你实际上需要另一个实体,将间隔与一组事件联系起来。然后,每当关系发生变化时,也可以很容易地预先计算/维护这个计算(即你在关系中添加一个实体,更新间隔)。