我正在使用rails应用程序构建ruby,用户可以从故事中学习单词(在他的故事列表中有许多故事可供学习),相反,故事可以属于许多用户。虽然故事并非由用户拥有(它由作者拥有),但用户可以跟踪与他有关的每个故事的某些个人事物,并且仅跟踪他,例如留下多少单词需要学习。他的每个故事(显然会因用户而异)。
目前,我通过名为users_stories的第三个表设置了has_many:through关系。我的关注/问题与"计算字段有关":是否真的有必要在数据库中存储words_learnt_in_this_story(或相反地,words_not_yet_learnt_in_this_story)之类的内容?在我看来,这样的事情可以通过简单地查看用户已经学习的所有单词的列表(出现在他的learnt_words_list上)来计算,然后简单地对比/比较该主列表与该单词列表中的单词列表。故事,以计算有多少单词是无知的。
这里的困境是,如果是这种情况,如果可以简单地计算所有这些字段,那么似乎没有理由拥有单独的模型。如果是这种情况,那么中间应该只有一个连接模型,并且它是一个has_and_belongs_to_many关系,不是吗?此外,在这种情况下,哪些计算属性(例如words_to_learn)会被存储?或者他们可能根本不需要存储,而只是在每次用户加载主页时动态计算?
对此的任何想法将不胜感激!谢谢,迈克尔。
答案 0 :(得分:2)
如果您要求"是否真的有必要将计算值存储在DB"我回答你不,没有必要。
但它可以给你一些优点。例如,如果您有很多用户并且用户调用那些计算很多的值,那么偶尔计算它们可能是更可靠的策略。它将节省您的服务器资源。
现在你真正的问题是"什么对你更有效?每次计算值或偶尔计算一次并存储在DB中?"
答案 1 :(得分:0)
在真正的关系数据模型中,您不需要存储可以从现有数据计算的任何内容。
如果我理解正确,你只想拥有一个主词列表(表格),并在关系中引用这些词。这正是它应该如何在关系数据库中建模,我建议你坚持使用它是出于一致性的原因。只需确保在数据库中设置索引即可。
如果你在未来的路上遇到性能问题(通常你不会),你可以通过缓存/视图等解决问题。
答案 2 :(得分:0)
没有必要在DB中存储计算值,但是如果值经常在逻辑或视图中使用,那么将其存储在数据库中一次(在更改时再次计算)并从那里使用而不是在视图中计算或模型。