1

我正在构建一个 Rails 应用程序,数据应该在每个“季节”重置,但仍然保留。换句话说,从任何表中检索到的唯一数据应该是当前季节的数据,但如果您想访问以前的季节,您可以。

我们基本上需要整个数据库的多个实例,每个季节一个。

客户的想法是在赛季结束时导出数据库并保存,然后重新开始。这样做的问题是我们不能一次查看所有数据。

我唯一的想法是为season_id每个模型添加一列。但在这种情况下,每个查询都需要有where(season_id: CURRENT_SEASON). 我应该把它作为每个模型的默认范围吗?

有没有好的方法来做到这一点?

4

2 回答 2

2

如果您想要一个数据库中的所有数据,那么您必须对其进行过滤,这样您就走在了正确的轨道上。这完全没问题,因为无论如何都会过滤数据,所以这没什么大不了的。此外,您所描述的听起来非常类似于将数据标记为已存档(当前季节中没有的任何内容基本上都已存档),这是非常常见的事情,并且通常通过在每条记录上设置一个布尔标志来完成(我相信) true 或 false 以隐藏它,或一些等效的方法。

您可能需要 a scopeordefault_scope,其中 a 的主要缺点default_scope是您必须.unscoped在要访问当前季节之外的所有数据的地方使用,而不使用默认范围意味着您必须在每次调用时指定范围。默认范围似乎有时也会应用在有趣的地方,根据我的经验,我更喜欢总是明确说明我正在使用的范围(即我因此从不使用default_scope),但这更多是个人喜好。

在如何设计数据库方面,您可以为每条记录添加布尔标志,以告知该数据是否在当前季节,或者如您所述,您可以包含一个season_id将根据当前季节 ID 和过滤器进行检查的就这样。无论哪种方式,某种范围都是一种很好的方法。

如果使用简单的布尔值,那么在当前赛季结束或新赛季开始时,您必须将任何当前赛季记录标记为不再是当前的。这可能需要一个 rake 任务或类似的东西来使其方便,但会增加少量维护。

如果在代码中使用season_id加号常量来指示当前的季节(可能通过配置文件),则将事物标记为当前季节会更容易,因为每个季节都不需要数据库更新。

于 2013-04-08T19:34:31.347 回答
1

[免责声明:我不熟悉 Ruby,所以我将仅从数据库的角度发表评论。]

这样做的问题是我们不能一次查看所有数据。

如果您需要保持旧版本可访问,那么您应该将它们保存在同一个数据库中。

设计“版本化”(或“时间”或“历史化”)数据模型是一种魔法——让我知道您的模型现在的样子,我可能会对如何“版本化”它提出一些建议。在处理版本化对象之间的连接时,事情会变得特别复杂。

同时,请查看这篇文章,以获取此类模型的示例(与您的领域无关,但希望能提供一些想法)。

或者,您可以尝试使用特定于 DBMS 的机制,例如 Oracle 的闪回查询,但这显然不是每个人都可以使用的,并且可能不适合保留永久历史记录......

于 2013-04-08T20:17:07.430 回答