我的应用程序有大量(~100K且不断增长)的项目,这些项目根据其分数排名。只有少数(约100个)项目处于活动状态并且在给定时间内具有变化的分数,并且需要实时(同步)警告他们的等级变化。通常情况下,活动项目的得分会逐渐增加,但有时会上升或下降。
我目前的解决方案是将所有项目的分数保存在RAM中。每当我增加单个项目的分数时,我会检查该项目的分数是否高于其前面的项目并交换,直到它按排序顺序返回。对于大跳跃,我进行二分搜索,重新插入项目,并更新起始位置和结束位置之间的每个项目的排名。如果他们的排名在任何时候发生变化,我会通知他们新职级的任何活跃项目。
现在我的问题是:有没有办法在SQL数据库中有效地维护这样的排名? (我目前正在使用PostgreSQL。)我知道数据库永远无法击败我当前的,高度专业化的方法,但只要它仍然相对较快,我很乐意牺牲一点点效率。我现在有其他想要访问相同排名数据的接口,但是当它隐藏在我的主应用程序中时它们不能被打扰。注意:其他接口不需要实时数据,只需几分钟的不准确就可以了。
思想:
我知道我可以使用dense_sort()来动态生成排名。这个查询目前在我的桌子上需要80ms,因此在应用程序的实时部分中使用它太慢了。
是否存在可解决此类问题的PostgreSQL插件或备用软件?看起来它可能是一个普通的。
两个半解决方案:1。定期更新数据库中的分数,并允许其他接口使用slow dense_sort()(可能在物化视图上)获取项目的排名,或者2.保持排名在数据库中,并定期从我的主应用程序更新它们,以便其他接口可以直接选择它们。
有关现有解决方案的任何指示,建议或提示可以帮助我解决这个问题,我们将不胜感激。谢谢!