需要帮助记录网站上的所有活动以及数据库更改。
要求:
我可以想到数据库设计,但要么涉及很多表(每个事件一个),所以我可以在一个单独的字段中记录事件的每个参数,或者它涉及一个带有通用字段的表(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,所以希望其中一个能够占上风,除非已经有针对这些事情的既定解决方案。
答案 0 :(得分:24)
就插入/删除/更新而言,记录数据库更改,就最佳实践而言,通常通过主表上的条目将条目写入审计表(每个真实表一个审计表,具有相同的columsn + when / what / who columns)。
作为通用列表的事件列表不存在。它实际上是您的应用程序/框架/环境/业务需求的函数。就最佳实践而言,最好确定您的事件类型列表是100%平坦,2级层次结构(类型/子类型 - 这通常是最佳方法)还是N级层次结构(更难/更少)高效实施,但非常灵活,为正确的企业事件管理提供了非常好的可能性 - 我参与了所有3个计划的实施,所以我从实践BTW说起。)
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)