存储不经常更改的每月重复数据的有效方法?

An efficient way to store monthly recurring data that does not change frequently?

我正在尝试找到一种有效的方法来存储不经常更改的每月重复数据。

class Fund < ApplicationRecord
  has_many :factsheets
end

class Factsheet < ApplicationRecord
  belongs_to :fund
end

基金每月 会有一份新的概况介绍。
每个资料单上都有一个 objective(假设文本很长)。
objective 可能每个月 更改 ,但 不经常 (例如,每 ~10 个月更改一次)。

有什么好的方法来存储objective?

选项 1:

将objective放入模型Factsheet,它会重复很多。
(存储12objectives 12个月,但大部分可能一模一样)

选项 2:

制作objective模型,然后基金has_many :objectives

class Objective < ApplicationRecord
  belongs_to :fund
end

Objective 将有一个列 :effective_on 来指示:基金应从哪个月份开始在其资料单上使用此 Objective 记录。
(如果只更改一次,则存储 2 objectives 12 个月)

选项 3:

更好的主意?

我会根据你的情况选择最简单的选项,即第一个。

现在为什么?我的动机是规模。在我看来,选项 2 是过度工程的常见案例。在 100 年 后,一个 table 上将有大约 1200 条记录,并且为了论证,我们假设 objective 从不 更改:您将在数据库中获得 1200 个重复的条目。

这有什么大不了的吗?我想不是。对于这个规模,我相信一点重复是完全可以容忍的。

如果您要每秒创建一个条目,我们可以讨论更好的解决方案,但我建议您使用最简单的解决方案并专注于确实需要一些精心设计的解决方案的问题: ).

我会选择选项 2...因为正如您所解释的那样,这是现实世界中的真实关系。 "a fund has_many :objectives" 的口头表达要求目标成为榜样。这样做也是为了将来的灵活性...也许目标可以属于其他模型?

如果您使用选项 2,您可以执行类似 Fund.last.objectives 的操作并查看最后一个基金的所有目标,而第一个解决方案不容易实现这种灵活性......您将不得不做 Fund.where('created_at > ?', Time.now.beginning_of_year).pluck(:objective) .... 第二个选项更清晰,当然不是 "over engineering" 任何东西。