我有一个带有一些分层数据的基本CRUD应用程序,例如:
user
- 有很多 - > topic
- 有很多 - > post
我想缓存一些统计数据,例如主题中的帖子数量,因此可以快速显示给用户。但是我想避免查询数据库并使用相同的主题ID计算所有帖子(我使用 mongodb ,所以没有连接,但即使我使用关系数据库,问题也是一样的)。
在网络应用中解决此问题的典型模式是什么?
这就是我的想法:
将子元素的数量存储为父元素的属性。 ie User.numOfTopics
将存储主题数,当发生CRUD事件时,更新父元素
if (new topic created) {
user = find user object from DB
++usr.numOfTopics;
}
优点:
1)。易于实施和理解
2)。准确
缺点:
1)。每个添加/删除操作不仅会更新受影响的元素本身,还会更新其父元素,因此我的数据库操作数量增加了一倍。如果用户添加/删除很多,那么它的性能可能会比计算一次更糟。
2)。统计数据收集与正常的业务逻辑相结合。
动态构建统计信息的进程内缓存。当用户连接时,有一个单独的进程计算用户的统计信息,将结果存储在缓存中并从那里提供将来的请求。任何未来的CRUD操作都将更新进程内缓存。
优点:
1)。统计信息收集与业务逻辑(排序)分开
2)。较少的数据库查询,这应该意味着更好的性能。
缺点:
1)。缓存结果不会持久化,因此如果服务器重新启动,则必须重建缓存,这将在首次访问时产生长延迟。
2)。统计过程与主过程并行运行,因此结果受竞争条件的影响。
有没有更好的方法来处理这个问题,我搜索了类似的问题,但大多数都提到了像RoR和ASP.net这样的特定框架。我想知道一般设计模式,如果有一个,或者解决方案最适合node.js。