【问题标题】:Database design to track updates since last visit数据库设计以跟踪自上次访问以来的更新
【发布时间】:2011-01-09 23:56:51
【问题描述】:

我正在为论坛类型的应用程序设计数据库。用例涉及为用户显示未读主题。因此,我需要跟踪每个用户 ID 的每个帖子的已读/未读状态。

我有用户和帖子表。我想我应该使用用户 ID 和 postid 创建“Read_Posts”表,这样我就可以将每个用户看到的帖子添加到这个表中。但是,随着时间的推移,这张桌子会变得非常庞大。

还有其他替代方法吗?

谢谢!

【问题讨论】:

  • 我认为您可以创建包含 post_id 的表和另一个包含逗号分隔的用户 ID 字符串的列。这样你至少可以最小化表中的行数。
  • @Harry - 并增加查询的复杂性。更不用说让它们变得更贵了。
  • @Oded:不会增加查询复杂度。只是增加对数据进行操作的编码逻辑的复杂性。而且据我认为,从逗号分隔的字符串中获取 id 数组并不难。它还有助于查询,我们在其中编写“user_id 在哪里('这里我们可以直接获取逗号分隔的字符串')”。
  • @Harry - 那么,如果您想要用户 X 已阅读的帖子列表?
  • @Oded:哦。是的,您是对的,如果我们希望用户阅读帖子,这将失败。这将增加这项任务的复杂性。 :-(

标签: database-design


【解决方案1】:

您的设计似乎是正确的。

您或许可以考虑将此功能过期 - 也就是说,任何超过一周(或其他)的帖子都可以从该表中删除(存档或不存档)。

或者每个用户最多 10 个未读帖子...

【讨论】:

  • 我想我会坚持我最初的设计。超过 100 天的任何帖子都被视为已存档,并将显示为已读。因此,任何
【解决方案2】:

您可以尝试以某种方式压缩信息。您需要向用户显示他是否已阅读帖子,只有当用户登录时,您应该将信息存储在用户附近的某个地方。用户可能会以日期排序的方式浏览您的帖子,因此近日期的阅读帖子信息应该就在附近,以便有效地缓存和读取许多值。

试试这个结构的桌子:

  • user_id
  • 月后
  • readposts_array

根据您期望的帖子数量,您可以使用周或日而不是月。如果您在应用中缓存该值,则在显示许多帖子时可能会看到性能提升。

【讨论】:

  • 您是不是在认真建议需要查询的非规范化列?
  • 不,它没有。您在月后查询,并希望在本月获得大量阅读帖子。我只是假设对 10 个帖子的数据库执行 10 个查询可能会减少为执行 3 个查询并且必须查看一个数组。可能会更快,我会尝试一下,但这在很大程度上取决于使用模式。
【解决方案3】:

对于每个用户,您可以在他们注销时(或在他们执行的每个操作时)存储最大的 post_id。然后当他们返回时,任何 id 大于 id 的帖子都会被标记为新帖子。

它不考虑他们上次访问时未阅读的帖子,但会提供一个简单的活动指标,表明自上次访问以来的新活动。它只需要在 users 表上增加一列,因此影响应该相对较小。

这假设帖子的 ID 是递增的整数

【讨论】:

  • @Kirs:但可能会发生用户直接阅读第 10 篇文章而不阅读前 9 篇文章并注销的情况。那么会发生什么呢?他将错过前 9 个帖子。
  • 正如我提到的“它不考虑他们上次访问时未阅读的帖子” - 它不完全符合 OP 所述的跟踪所有已阅读帖子的要求,但我认为这可能是考虑快速标记“自上次访问以来的新内容”的另一种选择。例如,PHPBB 似乎以这种方式工作,尽管我没有检查代码/数据库中使用的机制
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多