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

b0x*_*0rz 25 events logging database-design

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

要求:

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

我能想到的一个数据库设计的,但无论是它涉及到很多表(每个事件之一),所以我可以记录每一个事件的参数,在一个单独的字段或它涉及到一个表,通用字段(7 INT数字和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
Run Code Online (Sandbox Code Playgroud)

等等...

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

我已经看到了它与上面提到的通用的解决方案做了,但不知何故,这违背了我从数据库设计学,但你可以看到,需要能够跟踪事件的绝对数量(每个用户将能够看到这些信息)让我头疼,但我确实喜欢每个表格解决方案的一个事件而不是通用表格.

有什么想法吗?

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

日Thnx

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

DVK*_*DVK 25

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

  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的有效标记.


示例:

事件:搜索[搜索字符串]并获得[结果数]后,[用户名]点击结果[结果编号] [结果编号] @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)