【问题标题】:Best way to show a user random data from an SQL database?显示来自 SQL 数据库的用户随机数据的最佳方式?
【发布时间】:2013-11-19 13:03:15
【问题描述】:

我正在使用 Python (Flask) 开发一个 Web 应用程序,它基本上以随机顺序显示来自 PostgreSQL 数据库(通过 Flask-SQLAlchemy)的用户信息,每组信息都显示在一个页面上。点击“下一步”按钮将通过将页面上的所有数据替换为新数据,将用户引导至下一组数据,依此类推。

我的难题在于使演示变得真正随机 - 通过记住用户所看到的内容而不是再次向他们显示那些已经看过的数据集,不会向用户显示相同的信息两次。

该网站没有用户系统,当他们关闭选项卡/窗口或导航离开时,应该忘记“已经看到”的数据集。

我还应该补充一点,总的来说,我是 SQL 的新手。

最好的方法是什么?

【问题讨论】:

  • @MarkRichman - 我不认为这是重复的,因为我希望获得用户尚未看到的随机行,而不仅仅是任何随机行。我还使用 SQLAlchemy,而不是实际的 SQL,来执行查询
  • 我的难题在于使演示变得真正随机 - 不会通过记住用户所看到的内容来重复向用户显示相同的信息,并且不会再次向他们显示那些已经看过的数据集。 i> 只是一个挑剔:根据定义,您这样做会使您的数据变得更少随机。也许这就是你需要你的应用程序做的事情,但是当你说你试图让事情 真正 随机然后描述一些 less 随机的东西时,你会让人失望不仅仅是挑选任何元素。
  • 正如@MarkHildreth 所说,您正在寻找的并不是真正随机的。那么我要问的是,您是否需要为您的用例提供如此复杂的解决方案。首先,您如何索引数据?如果它是从 1 开始的通常的自动索引,您可以只存储最新的(也就是最高的索引),并在该范围内做一个随机数。示例:random_id = str(random.randint(1, latest_id)) 然后SELECT * FROM data WHERE id = random_id。这比“按兰德订购”要快一点。相信你可以在flask启动的时候查询到最新的id,存入内存,需要的时候再更新。
  • 下一个问题是您是否需要记住用户已经看到的内容。如果您的数据集足够大,您可能不必担心存储用户已经看到的数据。例如,如果您有超过 1,000 个项目,而您的用户在一次访问中平均查看 50 个,那么他们在每次下次点击时看到重复的最高机会小于 5%。如果您的某些用户浏览的次数要多得多,那么在这些情况下,您还可以考虑给他们不同的顺序来浏览数据(例如最新、最旧、最受欢迎等)。

标签: python sql flask flask-sqlalchemy


【解决方案1】:

最简单的方法是在客户端用javascript生成随机数...

告诉客户端最高编号的行是什么,然后客户端页面会跟踪它请求了哪些id(只是一个简单的js数组)。然后,当单击“请求下一个随机页面”按钮时,它会生成一个小于最高有效行 ID 的新随机数,并且如果该数字不在其先前查看的项目列表中,它将发送一个请求项目。

这样,您(在服务器上)只需有 2 个数据库访问视图:

  1. 主页面(给出了js,以及最高的有效行id)
  2. 显示一个项目(按 id)

您没有任何复杂的会话跟踪,用户的浏览器只需要跟踪一个简单的数字列表,即使他们亲自查看了数千个不同的项目,也只是一两兆内存。

出于性能原因,您甚至可以在当前项目加载后立即预取下一个项目,以便它立即显示并在他们查看时在后台加载下一个项目。 (jQuery .load() 是你的朋友 :-))

如果您希望从数据库中删除大量项目(因此最大的数字没有帮助),那么您可以生成一个随机 ID 列表,发送它,然后一次请求一个.就像是预先生成随机列表一样。

希望这会有所帮助! :-)

【讨论】:

    【解决方案2】:

    您可以将“已经看到”的数据粘贴到会话 cookie 中。选择随机SQL数据说明here

    【讨论】:

    • 这将在大型数据集和/或查看大量页面的用户上失败。首先,'order by RAND()' 解决方案非常慢,因为它们需要整个表扫描;此外,cookie 的大小限制为 4K,因此根据您存储的密钥大小,您可能只能存储大约 1000 个“已经看到”的密钥。
    • 以我期望应用程序扩展的速度,肯定会有我需要持有超过 1000 个键的情况。
    • 在我看来,最好的方法是遵循@Mark 的建议,但使用将保存会话和访问项目的数据库表。从长远来看,没有其他方法是好的
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 1970-01-01
    • 2021-01-17
    相关资源
    最近更新 更多