2

我目前正在开发一个 Web 应用程序,并且客户希望存储有关网站上用户活动的数据。这超出了 Google Analytics 所能提供的范围。

我目前有一个非常简单的数据库结构,其中包含最少数量的表,这些表都与网站的核心功能相关。

我有点不情愿在数据库模式中添加大量表来记录用户活动。并且还通过添加服务来记录网站上的用户活动来混淆代码库。

他们想要记录的示例如下:

  • 现有用户的登录
  • 用户显式注销
  • 管理员重置密码
  • 用户重置/更改密码
  • 更改用户帐户(例如,如果我们有个人资料,则授予/删除管理员权限或个人资料更改)

他们可能还想记录

  • 在搜索表单中输入的搜索参数
  • 访问任何(内容)页面
  • 选择任何(内容)链接
  • 语言选择

所以我的问题是:

  • 我应该将此功能添加到数据库和项目中吗?
  • 我是否应该尽可能将其分开,可能将此分析数据存储在单独的数据库中,或者可能在不同的模式中,为分析服务创建一个单独的项目。
  • 还有选择吗?

我只是觉得记录这些数据会使代码库和数据库变大,而且收益很小……。

4

2 回答 2

1

将此功能添加到您的项目中。但不能进入你的数据库。相反,将其存储为日志。

我从不喜欢将其放入您的数据库(尤其是您的生产数据库)中的想法,因为对该数据库的任何查询都会影响您的系统性能。

但是,您还需要创建一个批处理作业来读取此日志,并从中生成任何必要的数据。

如果日志变得这么大,你应该去Map Reduce方法。使用 Hadoop、Hive 或任何类似产品。

于 2013-02-06T03:21:50.700 回答
0

我至少会考虑制作一个通用表来记录任何活动。就像是:


event_id int,
event_name nvarchar(100),
event_date smalldatetime,
user_id int,
source_page nvarchar(100),
additional_info nvarchar(5000)

你可以让它涵盖我想象的大多数用例。只是在最后抛出一个大文本字段的想法,您可以在其中编写一些序列化的 JSON。它只是一个可以存储一些结构化文本的 blob。

按照同样的思路,您可以创建一个单独的数据库来存储无模式数据,这将更容易写入,并且如果您以后想取消注销,则不必修改现有数据库。

还可以查看面向方面的编程以进行日志调用。这可以使您的方法非常干净,同时允许记录和事件。对于 Java,可能是 Aspect J ( http://eclipse.org/aspectj/ ),对于 .NET,可能是 PostSharp ( http://www.sharpcrafters.com/aop.net )。

无论如何,就像你说的那样,我会实现一些占用空间小的东西,可以很容易地移除。

于 2013-02-05T17:35:33.230 回答