我有一个跟踪会员卡持卡人的rails应用程序,需要报告持卡人的状态。业务规则将状态定义为“信誉良好”、“欠款中”或“已取消”,具体取决于持卡人最近的发票是否已支付。
发票是提前30天寄出的,所以刚刚开票的客户仍然是信誉良好的客户,逾期20天的客户是欠费客户,超过30天仍未支付发票的会员将被取消。
我正在寻求建议,是否将持卡人的当前状态存储为客户级别的字段会更好(并处理由于发票记录的潜在更新而导致的潜在更新异常,而不更新相应的持卡人记录),或者是否更有意义的是,每次请求状态时,根据数据库中的数据计算当前持卡人状态(这可能会给数据库带来大量负载,并降低应用程序的运行速度)。
推荐?或者其他我没有想过的想法?
一个重要的限制:虽然任何人都不太可能直接修改数据库,但这种可能性总是存在的,所以我需要尝试设置一些保护措施,以防止各种数据库记录彼此不同步。
发布于 2009-12-23 00:40:21
数据库中计算数据的存储通常是一种优化。我建议您计算每个请求的值,然后监视应用程序的性能。如果该数据未存储的事实成为您的问题,那么是时候重构并将该值存储在数据库中了。
出于您前面提到的原因,存储计算值,尤其是那些可能影响多个表的值,通常不是一个好主意。
当您重构并将该值存储在数据库中时,您可能需要一个批处理作业来定期检查该值的数据完整性。
发布于 2009-12-23 00:43:14
最简单的方法是每次请求状态时,根据数据库中的数据计算当前持卡人状态。这样,您就不会有重复的数据,因此不会出现重复不同步的潜在问题。
如果且仅当您的测量结果显示此计算导致显著减慢时,您才可以考虑缓存该值。
发布于 2009-12-23 00:44:18
最近我也做出了类似的决定,我决定将status作为一个字段存储在数据库中。这是因为我想减少sql查询,而且它看起来更简单。我选择这样做是因为我经常需要获得这个状态,并且计算它(至少在我的情况下)有点复杂。
可能的问题是它不同步,所以我添加了一些after_save和after_destroy到子模型中,以保持同步。当然,如果有人以不同的方式修改数据库,就会产生一些问题。
您可以编写简单的rake任务,该任务将检查所有状态,并在需要时更正它们。您可以在cron中运行它,因此您不必担心它。
https://stackoverflow.com/questions/1947520
复制相似问题