【问题标题】:How to maintain a list of N most recent viewed items per user in a relational database如何在关系数据库中维护每个用户最近查看的 N 个项目的列表
【发布时间】:2014-06-17 17:17:30
【问题描述】:

我想跟踪用户在 PostgreSQL 数据库中查看的最后 n 个项目。我的第一个想法是创建一个表格,例如

CREATE TABLE history (
  id            SERIAL PRIMARY KEY,
  user_id       integer REFERENCES users (id),
  item_id       integer REFERENCES items (id),
  view_date     timestamp DEFAULT current_timestamp
);

当用户查看对象时,history 表中的新行将记录该视图。但我只需要为每个用户维护最后的 n 个视图,这种方法将存储曾经出现的每个视图。

有没有一种有效的方法来定期删除所有用户的超过他们最近 n 条的条目?

编辑:如果有比使用 SQL 表更好的方法来存储这些数据,我很想听听。

【问题讨论】:

  • 每次选择时都需要存储吗?您能否在内存中创建一个数据结构并在用户会话的开始/结束时加载/保存。
  • 如果 COUNT > n,如何与每个 INSERT 一起删除最旧的?
  • 也许添加和维护一个 view_order 列会有所帮助,如果这必须位于 SQL 中?从读/写的角度来看,@AdmiralAdama 的建议会更好。
  • @AdmiralAdama 很可能我会在每次选择对象时存储时间戳(除非开销使这不可行)。我通过无会话 API 提供对数据的访问。
  • @nate 您建议用什么替代方法来存储这些信息?

标签: sql database postgresql


【解决方案1】:
delete from history
where id in (
    select id
    from (
        select
            id,
            row_number() over(
                partition by user_id
                order by view_date desc
            ) as rn
        from history
    ) s
    where rn > n
)

【讨论】:

    【解决方案2】:

    有没有一种有效的方法来定期删除所有用户的超过他们最近 n 的条目?

    设置每十分钟左右分组、订购和投放的作业。在这种查询中,您不会发现很大的改进空间。

    从设计的角度来看,虽然我更倾向于创建一个内存数据结构,您可以在用户会话的开始/结束时加载/保存它。这样你就不会用这种工作打败你的数据库。 但您的要求可能会使此策略无法实现。

    干杯!

    【讨论】:

      【解决方案3】:

      如果有比使用 SQL 表更好的方法来存储这些数据,我会 有兴趣听听。

      数据库用于在相当长的时间内保持值/对象状态。如果您需要频繁访问/更新最新项目,请使用缓存。

      您可以监听缓存通知,当列表过期或被驱逐时,捕获,序列化并保存到数据库。

      http://msdn.microsoft.com/en-us/library/ee808091(v=azure.10).aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-18
        • 1970-01-01
        相关资源
        最近更新 更多