【问题标题】:SQL database – track user's activitySQL 数据库 – 跟踪用户的活动
【发布时间】:2020-01-04 10:43:39
【问题描述】:

我有一个简单的数据库结构,带有模型和关系:

型号:

  1. 用户
  2. 活动

关系:

  1. User/Group –> 用户属于组,组有很多用户
  2. User/Activity –> 用户有很多活动,Acitivty 属于用户
  3. Group/Activity –> Activity属于Group,Group有很多Activity

我的问题 - 我希望能够跟踪用户在给定时间段内(可能是每周,但可能是每天)在群组中执行的活动数量,但我不知道什么是最好/最高效的方法实现这一目标。

理论上,我可以执行一个查询,根据 created_at 日期属性计算这些活动,但我认为这不是最高效的方式(我错了吗?)

有谁知道如何正确地构造这样的东西?

【问题讨论】:

  • 您的要求不清楚。您想要特定用户在一天或一周内在每个组中执行的总活动吗?具有预期输出的示例数据集将帮助您获得解决方案。
  • @Samir 是的!我正在编写的后端对用户的活动施加了限制,例如用户每周只能在群组内发帖 7 次(或一天一次)。
  • 我会在应用程序代码中实现这样的规则,而不是在数据库元数据中。
  • 如您所说,根据created_at datetime 属性计算它们。当然,在useridcreated_at 列上放置一个索引。除非您的网站发展到非常大的规模,否则这可能会产生令人满意的性能,如果这样做,您无论如何都必须重新设计所有内容。
  • @Ancinek 。 . .我删除了不一致的数据库标签。请仅使用您真正使用的数据库进行标记。样本数据和期望的结果真的很有帮助。

标签: sql database


【解决方案1】:

根据你提供的关系,你的activity表有一个外键引用user_idgroup_id,你可以得到一个组下一天用户活动的计数。

SELECT a.user_id, a.group_id, count(a.user_id)
FROM activity a 
WHERE a.user_id = '123'
AND a.group_id = '1'
AND a.activity_time >= '2019-08-31'
AND a.activity_time < '2019-08-31' + INTERVAL 1 DAY

user_id, group_id, activity_time 上创建一个复合键,以便在将来表大小增加时更快地检索。

请注意此查询位于MySQL

【讨论】:

    猜你喜欢
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2013-09-13
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多