我有一个用于 Web API 的用户数据库,但我还想存储每个用户的使用历史记录,即:页面请求计数、数据量等。就数据库结构而言,实现这一点的最佳方法是什么?我最初的想法是保留主表,然后为每个用户创建一个历史表。然而,这似乎非常不切实际。我的直觉是,我可能需要一个单独的表来记录使用历史,但我不清楚如何构建它。
我正在使用 SQLite。
我有一个用于 Web API 的用户数据库,但我还想存储每个用户的使用历史记录,即:页面请求计数、数据量等。就数据库结构而言,实现这一点的最佳方法是什么?我最初的想法是保留主表,然后为每个用户创建一个历史表。然而,这似乎非常不切实际。我的直觉是,我可能需要一个单独的表来记录使用历史,但我不清楚如何构建它。
我正在使用 SQLite。
在我的一个程序中,我维护了每个用户的模块使用表。表的结构是
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
虽然聚合会丢失时间部分,但不会丢失其他数据,并且对表的查询会更快。
对于事件日志模型(这是您想要的),我可以推荐两个选项
一张桌子,让我们称之为activity_log
。
`activity_log`{
id INTEGER PRIMARY KEY,
user_id MEDIUM INT NOT NULL,
event_type VARCHAR(10),
event_time TIMESTAMP
}
对于系统中影响用户的每个事件,您都在该角色中插入一条记录(我相信列名是不言自明的)。我相信 SQLite 不提供本机TIMESTAMP
类型,因此您必须处理应用程序代码中的存储。这种设计会给您留下一个有可能变得非常大的表格,但它会给您提供细粒度的统计信息。SQLite 不支持聚集索引,但这里有一些选项可以帮助您进行性能调整。
与上面相同的表,只是不是为每个事件插入一个新行,您将执行一个条件插入,即为已经存在的用户更新现有行并为新用户更新。此选项将使您的表格比上面的表格小几倍,但您只能访问最近使用的 api。
如果你负担得起,我会说选择1号。