【问题标题】:Database Selection and Datetime Sorting (real-time Python dashboard)数据库选择和日期时间排序(实时 Python 仪表板)
【发布时间】:2011-09-26 14:05:20
【问题描述】:

我有一个用于实时更新和最新通知的仪表板。

想象一下这是一个博客系统,您可以在其中订阅作者的帖子和 cmets。 然后,我希望仪表板中出现 2 种类型的通知,按插入时间排序:

  1. 最后的帖子
  2. 最后的 cmets

想象一下,当我加载仪表板时,我只希望显示 10 个更新(后来我通过 ajax 进行更新)。我应该如何查询数据库以及如何对结果进行排序?

我曾考虑在 2 个表(posts 和 cmets)中查询我订阅的数据,将这些数据添加到列表中,然后根据日期时间对这些结果进行排序,然后返回最后 10 个,但我觉得这不是一个非常好的解决方案,因为如果这些表(和我的订阅)开始增长,则需要花费大量时间进行排序。

你对这个问题有什么答案/想法?

【问题讨论】:

  • 您是否使用了具有 ORM 的 Web 框架(如 Django)?不久前我在 Django 中做了类似的事情,大约有一百万行,数据库检索不是瓶颈。
  • 我正在使用带有 DAL(支持 MySQL)和 pymongo(支持 MongoDB)的 web2py

标签: python database real-time selection


【解决方案1】:

按照插入时间降序查询第一个表排序,并将结果限制为10。然后以同样的方式查询第二个表。然后在python中合并结果并返回前10个。

django 示例可能如下所示:

from operator import attrgetter

recent_posts = Post.objects.order_by('-created')[:10]
recent_comments = Comment.objects.order_by('-created')[:10]
both_combined = list(recent_posts) + list(recent_comments)
both_sorted = sorted(both_combined, key=attrgetter('created'), reverse=True)
most_recent = both_sorted[:10]

【讨论】:

  • 如果我在下方有一个加载更多按钮,它会给我接下来的 10 次更新怎么办?使用该解决方案会丢失一些更新。
  • 为确保没有遗漏任何内容,您应该将“最后一次看到的时间戳”传递给“下一个”视图,然后重复相同的步骤,只需添加等效的 WHERE created < that_timestamp。根据时间戳是否通过,您可能有一个函数同时执行这两种操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 2021-12-15
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
相关资源
最近更新 更多