Ruby on rails 计算字段:存储在DB中还是不存储?

Ruby on rails 计算字段:存储在DB中还是不存储?,ruby-on-rails,Ruby On Rails,我正在构建一个RubyonRails应用程序,用户可以从一个故事中学习单词(在他的故事列表中有许多故事可以学习),相反,一个故事可以属于许多用户。虽然故事不归用户所有(它归作者所有),但用户可以跟踪每个故事中与他相关且仅与他相关的某些个人信息,例如每个故事中还有多少单词需要学习(这显然因用户而异) 目前,我有一个has\u many:通过第三个名为users\u stories的表建立的关系。我的担忧/问题与“计算字段”有关:是否真的有必要在数据库中存储诸如本故事中的单词(或相反,本故事中的单词

我正在构建一个RubyonRails应用程序,用户可以从一个故事中学习单词(在他的故事列表中有许多故事可以学习),相反,一个故事可以属于许多用户。虽然故事不归用户所有(它归作者所有),但用户可以跟踪每个故事中与他相关且仅与他相关的某些个人信息,例如每个故事中还有多少单词需要学习(这显然因用户而异)

目前,我有一个has\u many:通过第三个名为users\u stories的表建立的关系。我的担忧/问题与“计算字段”有关:是否真的有必要在数据库中存储诸如本故事中的单词(或相反,本故事中的单词尚未学习)之类的内容?在我看来,这样的事情可以通过简单地查看用户已经学会的所有单词的列表(出现在他的已学单词列表上)来计算,然后简单地将主列表与故事中的单词列表进行对比/比较,以计算有多少单词未学

这里的困境是,如果是这样,如果所有这些领域都可以简单地计算,那么似乎没有理由有一个单独的模型。如果是这样的话,那么中间应该只有一个连接模型,并且它是Hasyand NothsTyth-Ty-多关系,不是吗?此外,在这种情况下,计算出的属性(如单词_to _learn)存储在哪里?或者,它们根本不需要存储,而只是在用户每次加载其主页时进行动态计算


如果您对此有任何想法,我们将不胜感激!谢谢,Michael。

在真正的关系数据模型中,您不需要存储任何可以从现有数据计算得出的数据

如果我理解正确,您只需要有一个主单词列表(表),并在关系中引用这些单词。这正是它在关系数据库中建模的方式,出于一致性原因,我建议您坚持使用它。只需确保在数据库中正确设置索引即可

如果以后遇到性能问题(通常不会),您可以通过缓存/视图等方式解决该问题。

如果您问“是否确实需要在数据库中存储计算值”,我会回答您。不,没有必要

但它可以给你一些好处。例如,如果你有很多用户,而用户称这些值计算很多,那么每隔一段时间计算一次可能是更容易获胜的策略。这将节省您的服务器资源


您现在真正的问题是“什么对您更有效?每次计算值或偶尔计算值并存储在数据库中?”

不必将计算值存储在数据库中,但如果这些值经常在逻辑或视图中使用,最好将其存储在数据库中一次(更改时再次计算)并从那里使用,而不是在视图或模型中计算

明白了。所以我想我的主要问题是,假设这些计算值会影响程序的逻辑,我应该把它们存储在哪里?换句话说,有一个用户已经学会的单词的主列表,但是否为他解锁某些东西取决于他在特定阶段学会了多少单词。我假设控制器是应该去的地方,但如果是这样,那么模型中会有什么样的逻辑,如果有的话?(请记住,许多值将被跟踪以获得用户进度)有趣的。。。是的,我肯定需要多次调用这些值以显示它们的进度。每次他们打开自己的主页时,他们应该能够看到一个附在每个故事上的进度条,显示他们在每个故事中还需要做什么,因此,将这个计算值附在每个用户的故事条目上似乎是一件好事。这种方法有什么缺点吗?@Michael缺点是在数据库中存储更多的数据。但我不认为那一点点额外的数据会困扰你。只有当数据库中存储的数据量很大时,这种负面影响才会影响到您。那么假设它确实被存储在不同的方程中“两次”,那么计算从哪里开始呢?我想它会在适当的模式,不是吗?该模型的代码会调用某种实例变量,在另一个模型中表示该对象的字段值?@michaelsking1993根据你问题中的信息,我认为计算字段存储在users\u stories表中是很自然的。很自然地,字段计算方法由用户持有。但这实际上取决于你的应用程序更具体的细节,这取决于你决定把逻辑放在哪里。然而,这样的决定不属于这个话题。希望我们的提示能对您有所帮助。明白了,从这个和VAD的答案来看,似乎应该将其存储在DB中,即使它是从其他字段计算出来的。然而,莱夫的回答仍然让我犹豫不决。在任何情况下,假设我将其存储在数据库中,我假设这意味着我在适当的模型文件中进行计算?或者计算是在控制器内部进行的?模型是逻辑和计算的最佳场所。