0

我有一个用于 Web API 的用户数据库,但我还想存储每个用户的使用历史记录,即:页面请求计数、数据量等。就数据库结构而言,实现这一点的最佳方法是什么?我最初的想法是保留主表,然后为每个用户创建一个历史表。然而,这似乎非常不切实际。我的直觉是,我可能需要一个单独的表来记录使用历史,但我不清楚如何构建它。

我正在使用 SQLite。

4

2 回答 2

1

在我的一个程序中,我维护了每个用户的模块使用表。表的结构是

table id
user id
prog id
date/time
history flag (0=current, 1=history)
runs (number of time user has run program on date)

大约每周一次,我汇总表中的数据:如果用户 1 在给定日期运行程序 1 两次,那么表中最初将有两个条目:

1;1;1;04/10/12 08:56;0;1
2;1;1;04/10/12 09:33;0;1

聚合后,表变为

3;1;1;04/10/12 00:00;1;2

虽然聚合会丢失时间部分,但不会丢失其他数据,并且对表的查询会更快。

于 2012-10-04T09:11:48.533 回答
1

对于事件日志模型(这是您想要的),我可以推荐两个选项

  1. 一张桌子,让我们称之为activity_log

     `activity_log`{
      id INTEGER PRIMARY KEY,
      user_id MEDIUM INT NOT NULL,
      event_type VARCHAR(10),
      event_time TIMESTAMP 
             }
    

    对于系统中影响用户的每个事件,您都在该角色中插入一条记录(我相信列名是不言自明的)。我相信 SQLite 不提供本机TIMESTAMP类型,因此您必须处理应用程序代码中的存储。这种设计会给您留下一个有可能变得非常大的表格,但它会给您提供细粒度的统计信息。SQLite 不支持聚集索引,但这里有一些选项可以帮助您进行性能调整。

  2. 与上面相同的表,只是不是为每个事件插入一个新行,您将执行一个条件插入,即为已经存在的用户更新现有行并为新用户更新。此选项将使您的表格比上面的表格小几倍,但您只能访问最近使用的 api。

如果你负担得起,我会说选择1号。

于 2012-10-04T10:02:51.207 回答