tl; dr - 在底部,我提出了一些关于智能数据库设计的一般性问题,这些问题并不需要阅读整个内容。所以请随意跳过并查看这些内容。谢谢!
我正在建立一个Rails网络应用程序,在一些用户输入之后,我生成了许多选项,用户可以从中选择一个选项,然后保存并与用户关联。这个选择可能会在生成选项后很长时间内发生 - 因此需要保存选项 - 但是一旦做出选择,所有"不正确"选项不再相关。
我对数据库如何工作以及减慢它们的速度知之甚少,所以我非常感谢有关如何最好地实现这一点的任何输入(如下所述),考虑到我在方法I&#39中看到的冲突我想到了。
在我看来,我可以在这里采取三条路径:
选项只是Choice
模型的实例,通过belongs_to
/ has_many
与用户相关联。当用户选择一个时,其id
被声明为用户的choice_id
(并且可能,其他选项与用户无关)。
我看到的主要问题是
Choice
表的大小会呈指数级增长。这是我的应用程序中的一个主要表格,我想尽快保持它。
在用户输入后,我生成并保存了5个Choice
个对象,其中belong_to
个用户options
为choice
。然后,当用户选择时,删除四个,并将第五个关联为该用户的单个choice_id
正如我所认为的那样,缺点是我最终会遇到大量的空白"数据库中的行,因此最高
choices
明显大于数据库中Option
的数量。我最近工作过的老板提出了永远不会删除数据的建议,这显然与这种方法有关。
我为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
继承,这很奇怪,但是无所谓)。
然而,所有这些观点都完全没有关于数据库架构和效率的知识,如果我知道的话,我会更好地解决权衡问题:
表中删除的行会减慢现有行之类的事务吗?减?什么?表大小在什么时候成为SQL数据库中的一个严重问题?是值得考虑的吗?
删除数据的最佳做法是什么?这是一个非常糟糕的主意吗?
围绕重复表的最佳做法是什么? (即具有相同数据结构的表,由于原始表中的任何原因而被区别对待)。
最广泛,最不合适且最有用的问题:您如何处理此问题,优化{{1}}表的效率? (但也要尽可能避免重复并遵循最佳实践)。
谢谢!
答案 0 :(得分:0)
前缀为'。'的小文件怎么样?所以它被隐藏(在unix中)放在用户主目录中。如果以可读格式输出选项,则可以轻松阅读和修改它们。
如果性能或功能合理,您只想使用数据库。如果您要求用户使用必须安装的数据库,客户可能不喜欢这样做。