2009-12-22 24 views
2

我有一个Rails应用程序,跟踪持卡人会员资格,并需要对持卡人的状态报告。状态定义 - 由业务规则 - 为是“信誉良好”,“拖欠”或“取消”,根据持卡人的最近的发票是否已经支付。在Rails应用处理对象的状态字段建议:将与计算?

发票是提前30天发送的,所以刚刚开具发票的客户仍然有良好的信誉,在付款到期日后20天的人拖欠了会费,并且会员不能更多地支付他的发票在到期后30天内将被取消。

我在寻找关于将持卡人的当前状态作为客户级别字段存储的建议(并处理潜在更新发票记录导致的潜在更新异常,而不更新相应的持卡人记录),或者是否更有意义,简单地计算每次请求的状态时(这可以将数据库上大量负荷,减缓了应用程序)根据数据库中的数据的当前状态持卡人。

建议?或者我还没有想过的其他想法?

一个重要的限制:虽然任何人都不可能直接修改数据库,但总有这种可能性,所以我需要设置一些安全措施以防止各种数据库记录彼此不同步。

回答

2

在数据库中计算出的数据的存储通常是一个优化。我建议你计算每个请求的值,然后监视应用程序的性能。如果未存储此数据的事实成为您的问题,那么现在是时间来重构并将值存储在数据库中。

存储计算的值,特别是那些能够影响多个表一般都为您所提到的原因,一个坏主意。

当/如果你重构并存储在数据库中的值,那么你可能要来检查,定期对数据完整性的值批处理作业。

0

最简单的方法是每次请求状态时根据数据库中的数据计算当前的持卡人状态。这样你就不会有重复的数据,因此没有潜在的问题,重复变得不合时宜。如果,且仅当您的测量表明,这种计算是造成显著放缓

,那么你可以考虑一下缓存值。

0

最近我有类似的决定采取和我决定存储在数据库中的字段状态。这是因为我想减少sql查询并且看起来更简单。我选择这样做的,因为我会很经常需要获得此状态,并计算其(至少在我的情况),有点复杂。

可能存在的问题是它不同步,所以我在子模型中添加了一些after_saveafter_destroy以保持同步。当然,如果有人以不同的方式修改数据库,会产生一些问题。

你可以写简单的耙的任务,将检查所有的状态,并在必要时进行更正。你可以在cron中运行它,所以你不必担心它。

相关问题