如何存储和检索大量数据以进行特定日期的检索+摘要检索?

时间:2010-09-25 04:28:35

标签: php mysql database-design data-structures

简化案例:

存储

  1. 用户点击链接
  2. 每次点击
  3. link_clicks +1
  4. 超级用户为每次点击设置乘数参数
  5. 每次点击
  6. link_reward(+1 * param)
  7. 每次点击也会记录用户ID
  8. 检索

    • 查询必须在特定日期范围内完成(例如,“10月10日至10月23日期间用户ID = 4的点击次数”)
    • 但是,大多数查询都将在给定用户的所有日期总和上完成

    假设表变得庞大,那么两种查询都会变得很慢吗?

    如何处理这个?同时存储在一个详细的表格中(每个链接每个用户每次点击一行)和一个汇总表(每个链接每个用户一行)?我听说过“卷起”数据,但我不知道这意味着什么。

    使用的技术:MySQL,PHP(和Javascript)

2 个答案:

答案 0 :(得分:1)

  

如何处理这个?同时存储在一个详细的表格中(每个链接每个用户每次点击一行)和一个汇总表(每个链接每个用户一行)?

是的,但添加DATETIME列,以便您可以执行(a)中提到的期间检查。使用NOW()函数填充DATETIME列以获取当前日期和时间。时间。关于选项(a)的一些注意事项是标准将最小化所汇总的数据,因此性能不应该太大。此外,可能不应对详细信息表建立索引,因为索引仅帮助获取数据 out ,并减慢将数据放入表

超级用户奖励可能应该是一个单独的表,但这意味着您的详细信息表需要通过其用户ID或URL与超级用户相关联。 userid将是更好的选择。

  

我听说过“卷起”数据,但我不知道这意味着什么。

数据库原则是仅存储您需要的内容 - 可以使用SUM和COUNT等函数计算摘要数据。您可以create a view,它可以像表一样查询,但不存储任何数据。

答案 1 :(得分:1)

易。 : - )

一个用户表,我称之为用户。

一个点击表,我称之为ClickEvent。

每个不同链接有一个表,我称之为HyperLink(避免使用DB中的“链接”一词)

根据我们所知道的(不多),用户表不是非常重要的问题或答案。

HyperLink表将存储每个链接上的所有信息,列为:

  • HyperLinkID
  • URL
  • ClickValue
  • RewardMultiplier

(我认为您所说的是为链接实体分配值和乘数,而不是每次点击事件,对吧?)

ClickEvent表是您的问题/答案的核心。我给它列如下:

  • ClickEventID,int(PK)
  • UserID,int(FK)
  • HyperLinkID,int(FK)
  • ClickDateTime,datetime
  • ComputedEventValue(十进制或 SMALLMONEY)

你对速度的担忧应该是微弱的 - 即使有很多活动,这也不是非常密集。每个事务(单击)都记录在ClickEvent表中。每次单击事件都会插入一条新记录,在插入期间,会写入ComputedEventValue。

这似乎涵盖了我所看到的主要想法。