-
就最佳实践而言,记录数据库更改(插入/删除/更新)通常是由主表上的触发器完成的,该触发器将条目写入审核表(每个实表一个审核表,具有相同的columsn+when/what/who列)。
-
作为通用列表的事件列表不存在。它实际上是应用程序/框架/环境/业务需求的函数。就最佳实践而言,最好确定您的事件类型列表是100%平坦的、两级层次结构(类型/子类型-这通常是最好的方法)还是N级层次结构(实现起来更难/效率更低,但非常灵活,并且为适当的企业活动管理-我参与了所有3个方案的实施,所以我在实践中说。
-
一个表中不需要7个通用in t字段来存储事件详细信息。而是转到标记值对表:
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).
事件详细信息可以规范化为事件详细信息int、事件详细信息varchar、事件详细信息float,…如果你愿意但不是真的需要。
事件表中的attrib1 atttribn是应用于所有/大多数事件的通用属性,如userid、hostname、pid等…
event_types是一个描述各种事件类型/子类型的表。
根据您决定项目符号点2的方式,此表可以存储类型的平面列表、类型/子类型映射的列表(如我的示例所示)或父类型/子类型的层次结构(为此,您需要两个表,一个用于类型的父/子映射,另一个用于每个类型的类型属性)。
您可能希望有另一个辅助表event_type_属性将事件类型映射到事件详细信息的有效标记。
例子
:
事件:[username]在搜索[search string]并获得[number of results]@datetime后,单击result[result number][result id]
这将导致类似的数据(不是实际的sql语法,sue me:):
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)