b0x*_*0rz 25 events logging database-design
需要帮助记录站点上的所有活动以及数据库更改.
要求:
我能想到的一个数据库设计的,但无论是它涉及到很多表(每个事件之一),所以我可以记录每一个事件的参数,在一个单独的字段或它涉及到一个表,通用字段(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
就最佳实践而言,记录数据库更改就插入/删除/更新而言,通常是通过主表上的触发器将条目写入审计表(每个真实表一个审计表,具有相同的columsn + when/what)来完成/谁列).
作为通用列表的事件列表不存在.它实际上是您的应用程序/框架/环境/业务需求的函数.至于最佳实践,这是一个好主意,决定您的事件类型列表是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)