我正在使用rails构建一个测试应用程序,它是一个新闻故事投票系统,用于教自己rails和ruby。
我正在尝试限制投票,因此用户只能在每篇文章上“投票”一篇文章。经过一些研究后,我发现使用它的最佳方法是在我创建的投票模型上添加验证,以检查该用户的重复投票条目。
我不是真的在一个代码示例之后只是一些建议,这是解决这个问题的最佳方法吗?活动记录可以完美地验证工作效果,但在数据库级别上施加这么大的压力并不是一种好的做法,但是这可能完全正常吗?
希望这是有道理的,感谢阅读。
答案 0 :(得分:1)
这实际上是正确的设计。在关系设置中,您将拥有Stories,Users和Votes,其中Votes同时具有user_id和story_id。实施数据完整性最终是一种数据库约束,您无法真正知道用户是否对某个故事进行了投票,而无需前往数据库进行检查。您可以保留某种更高级别的缓存,以防止在需要时进行相当多的数据库访问,但现在这样做是不成熟的优化。在需要的时候穿过那座桥。
要考虑的一件事是在您的投票表上创建(user_id,story_id)的复合唯一索引。这将有助于支持您的验证并提高对O(log n)操作的投票查找速度,这将消除大部分时间负担。您可以做的其他事情是禁止对旧故事进行投票,并清除任何超过某个年龄的投票记录(对应于您不允许投票的时间),这将使您的投票表在一段时间内保持相对恒定的大小,而不是只是允许它永远成长。