最佳实践 - 记录事件(常规)和更改(数据库)

时间:2010-05-09 12:23:02

标签: database-design events logging

需要帮助记录网站上的所有活动以及数据库更改

要求:

  • 应该在数据库中
  • 应该可以通过发起人(用户名/会话ID),事件(活动类型)和事件参数轻松搜索

我可以想到数据库设计,但要么涉及很多表(每个事件一个),所以我可以在一个单独的字段中记录事件的每个参数,或者它涉及一个带有通用字段的表(7 int numeric和7个文本类型)并记录一个表中的所有事件类型字段确定哪个参数写在哪里(并希望我不需要超过7个特定类型的字段,或8或9或我选择的任何数字)。 ..

条目示例(通常的事情):

[username] login failed @datetime
[username] login successful @datetime
[username] changed password @datetime, estimated security of password [low/ok/high/perfect]  @datetime
[username] clicked result [result number] [result id] after searching for [search string] and got [number of results] @datetime
[username] clicked result [result number] [result id] after searching for [search string] and got [number of results]  @datetime
[username] changed profile name from [old name] to [new name]  @datetime
[username] verified name with  [credit card type] credit card  @datetime
datbase table [table name] purged of old entries @datetime via automated process

等...

所以任何人在之前处理过这个问题?您可以分享的最佳做法 / 链接

我已经看到它完成了上面提到的通用解决方案,但不知何故这与我从数据库设计中学到的东西相悖,但是你可以看到需要跟踪的大量事件(每个用户都能够看到这个信息)令我头疼,但我确实喜欢每个表格解决方案的一个事件而不是通用表格。

有什么想法吗?

编辑:此外,是否有可能在某处发生此类(可能)事件的权威列表?

日Thnx

堆栈溢出说:您提出的问题似乎是主观的,可能会被关闭 我的回答:可能是主观的,但它与我设计数据库/编写代码的问题直接相关,所以我欢迎任何帮助。我也尝试将这些想法缩小到2,所以希望其中一个能够占上风,除非已经有针对这些事情的既定解决方案。

1 个答案:

答案 0 :(得分:24)

  1. 就插入/删除/更新而言,记录数据库更改,就最佳实践而言,通常通过主表上的条目将条目写入审计表(每个真实表一个审计表,具有相同的columsn + when / what / who columns)。

  2. 作为通用列表的事件列表不存在。它实际上是您的应用程序/框架/环境/业务需求的函数。就最佳实践而言,最好确定您的事件类型列表是100%平坦,2级层次结构(类型/子类型 - 这通常是最佳方法)还是N级层次结构(更难/更少)高效实施,但非常灵活,为正确的企业事件管理提供了非常好的可能性 - 我参与了所有3个计划的实施,所以我从实践BTW说起。)

  3. 1个表中不需要7个通用int字段来存储事件详细信息。而是转到标签值对表:

    EVENT_TYPES: (event_type, event_subtype, description, subtype_attr1, ...)
    EVENTS: (event_id, event_type, event_subtype, timestamp, attrib1, ...)
    EVENT_DETAILS: (event_id, tag, int_value, varchar_value, float_value).
    

    EVENT_DETAILS可以标准化为EVENT_DETAILS_INT,EVENT_DETAILS_VARCHAR,EVENT_DETAILS_FLOAT,......如果您愿意但不是真的需要。

    EVENTS表中的

    attrib1-atttribN是适用于所有/大多数事件的通用属性,例如userid,hostname,pid等......

    EVENT_TYPES是一个描述各种事件类型/子类型的表。

    根据您决定项目符号#2的方式,此表可能存储类型的平面列表,类型/子类型映射列表(如我的示例)或父类型/子类型的层次结构(您将需要2个表格一个用于类型的父/子映射,一个用于每种类型的类型属性。)

    您可能希望将另一个辅助表EVENT_TYPE_ATTRIBUTES映射事件类型转换为EVENT_DETAILS的有效标记。


  4. 示例

    事件:搜索[搜索字符串]并获得[结果数] @datetime

    后,[用户名]点击结果[结果编号] [结果编号]

    这会导致数据与此类似(不是实际的SQL语法,起诉我:):

    EVENT_TYPES: (USER_ACTION, USER_CLICK, "User clicked something")
    EVENTS: (12345, "USER_ACTION","USER_CLICK", @datetime, "[username]", 
             "app_name", "pid"...) 
    EVENT_DETAILS: several rows:
     (12345, "result_number", 33, NULL, NULL) // Or go into EVENT_DETAILS_INT without NULLs? 
     (12345, "result_id", 919292, NULL, NULL)  
     (12345, "search_string", NULL, "how do I log events in DB", NULL)