Rails应用程序 - 更好地保留或删除过时的数据

时间:2015-02-17 23:12:30

标签: sql ruby-on-rails database postgresql activerecord

  

tl; dr - 在底部,我提出了一些关于智能数据库设计的一般性问题,这些问题并不需要阅读整个内容。所以请随意跳过并查看这些内容。谢谢!

我正在建立一个Rails网络应用程序,在一些用户输入之后,我生成了许多选项,用户可以从中选择一个选项,然后保存并与用户关联。这个选择可能会在生成选项后很长时间内发生 - 因此需要保存选项 - 但是一旦做出选择,所有"不正确"选项不再相关。

我对数据库如何工作以及减慢它们的速度知之甚少,所以我非常感谢有关如何最好地实现这一点的任何输入(如下所述),考虑到我在方法I&#39中看到的冲突我想到了。

在我看来,我可以在这里采取三条路径:

  1. 选项只是Choice模型的实例,通过belongs_to / has_many与用户相关联。当用户选择一个时,其id被声明为用户的choice_id(并且可能,其他选项与用户无关)。

      

    我看到的主要问题是Choice表的大小会呈指数级增长。这是我的应用程序中的一个主要表格,我想尽快保持它。

  2. 在用户输入后,我生成并保存了5个Choice个对象,其中belong_to个用户optionschoice。然后,当用户选择时,删除四个,并将第五个关联为该用户的单个choice_id

      

    正如我所认为的那样,缺点是我最终会遇到大量的空白"数据库中的行,因此最高choices明显大于数据库中Option的数量。我最近工作过的老板提出了永远不会删除数据的建议,这显然与这种方法有关。

  3. 我为Choice模型创建了一个单独的表格,几乎在所有方面都与belong_to模型相同,因为选项需要完全丰富的替换为一个选择。这些选项user一个choice,如上所述,但当我选择一个人成为Choice时,他们就会离开。

    (这有点类似于this older post's discussion of archiving by moving old data to a new table。这被认为是一种好的做法吗?对我来说似乎很理想,但我不知道潜在的缺点。)

      

    正如我所看到的,此选项会保留所有数据,同时保持我的主Option表不受kruft未选择数据的影响。不幸的是,它在数据库中添加了一个主要重复,并且还有一个重复的代码(虽然我想我可以Choice只从Choice继承,这很奇怪,但是无所谓)。

  4. 然而,所有这些观点都完全没有关于数据库架构和效率的知识,如果我知道的话,我会更好地解决权衡问题:

    • 表中删除的行会减慢现有行之类的事务吗?减?什么?表大小在什么时候成为SQL数据库中的一个严重问题?是值得考虑的吗?

    • 删除数据的最佳做法是什么?这是一个非常糟糕的主意吗?

    • 围绕重复表的最佳做法是什么? (即具有相同数据结构的表,由于原始表中的任何原因而被区别对待)。

    • 最广泛,最不合适且最有用的问题:您如何处理此问题,优化{{1}}表的效率? (但也要尽可能避免重复并遵循最佳实践)。

    谢谢!

1 个答案:

答案 0 :(得分:0)

前缀为'。'的小文件怎么样?所以它被隐藏(在unix中)放在用户主目录中。如果以可读格式输出选项,则可以轻松阅读和修改它们。

如果性能或功能合理,您只想使用数据库。如果您要求用户使用必须安装的数据库,客户可能不喜欢这样做。