2011-03-22 77 views
2

我的问题是,我有很多事件发生在一个大型Web应用程序中,现在我想查看发生了什么(用于审计目的),或者我想汇总数据以进行统计报告。收集审计和统计数据

一种解决方案是在DB中为每种类型的事件创建一个表并将其记录在那里。例如更改密码,记录日期,用户,IP等。这将为我提供我需要的审计信息,并且还能够根据表运行报告以了解此功能的使用频率。缺点是我需要为每个要捕获的事件类型创建一个新表。

我的理想解决方案是使用一个更灵活的结构,也许是一个XML字段的单个表,但我并不是疯狂的表中的xml字段。

所以我的问题:是否有一个很好的(流行)模式来解决我的问题?

回答

1

每个事件一个表和一个表之间的中间方式(假定事件之间的差与该事件中携带的参数/数据):

Event Type 
    Event Type Id (PK) 
    Name 
    Number of parameters (useful - not essential) 

Event 
    Event Id (PK) 
    Event Type Id (FK) 
    Timestamp 

Event Attribute 
    Event Attribute Id (PK) 
    Event Id (FK) 
    Name 
    Value (as string in all cases) 
    Sequence Number (within Event. this may well not be needed, but can be a convenience) 

我不认为这是一个命名模式,但它是数据库设计中反复出现的模式。

我认为这会给你所需要的所有信息,而不需要存储XML。

+0

感谢克里斯 - 欣赏模式和解释。 – Guy 2011-03-24 18:32:12

2

您的大型网络应用程序有多大?

将事件记录为XML blob应该可以工作,并且某些数据库(例如SQL Server)可以让您直接查询该XML。但是,这些查询的性能很糟糕。

在数据库中进行事件日志记录之前,您应该计算出每秒要创建多少条记录。 如果数量很大,它会给数据库带来严重的负担,并可能影响您的整体应用程序性能。另外,一旦你累积了大量的记录,查询数据将永远持续(并且在这个过程中杀掉数据库性能)。聚合数据更糟糕 - 关系数据库在聚合方面效率不高。

克里斯的上述建议对于小型数据库很适用,但不会扩展,因为您的查询必须使用连接。解除数据标准化可能会更好。

即使您的应用程序没有获得足够的流量,您现在仍然担心此问题,请记住,由于上述原因,记录到数据库的事件无法很好地扩展。

Concreate建议:

如果你没有那么多的流量,并决定登录到数据库,这样做是为了一个独立的模式,这样它会更容易让你将它移到一个单独的数据库服务器,以便从生产数据库中卸载它。

如果您决定将事件记录为xml,请考虑使用关系数据库是否有用处 - 如果无法高效查询,那么简单的日志文件将更简单。当然,当然你必须弄清楚如何处理这些日志数据,但是对于不经常/简单的查询,使用grep,awk等编写一些脚本会让你有一个非常长的路要走。

通常通过(非常)大规模应用现今所用的方法记录到的文件,然后在运行使用分析(聚集)地图降低,例如在hadoop上。

+0

谢谢Elad - 感谢您的详细回复。 – Guy 2011-03-24 18:31:48

+0

就像感兴趣的事情一样,你认为联接不能缩放?我一直都明白,联接实际上是零成本,因此对数据库或其模式的可伸缩性没有影响。 – 2011-03-24 20:04:01

+1

@ chris-walton google“数据库连接不会扩展”,您将获得大量示例,主要来自NoSQL阵营。我还可以从个人经验中证明,一旦你传递了一定的表大小(在MySQL中少至1M记录,尽管它在很大程度上取决于配置,特别是RAM分配),加入查询的性能开始快速下降。 – Elad 2011-03-27 15:23:29