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

Database design 最佳实践-记录事件(常规)和更改(数据库),database-design,events,logging,Database Design,Events,Logging,需要帮助记录站点上的所有活动以及数据库更改 要求: [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

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

要求:

[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
  • 应该在数据库中
  • 应可通过启动器(用户名/会话id)、事件(活动类型)和事件参数轻松搜索
我可以考虑数据库设计,但要么它涉及很多表(每个事件一个),因此我可以将事件的每个参数记录在一个单独的字段中,要么它涉及一个带有通用字段的表(7个整型数字和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个,希望其中一个能占上风,除非已经为这类事情制定了解决方案

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

  • 作为通用列表的事件列表并不存在。它实际上是应用程序/框架/环境/业务需求的函数。就最佳实践而言,最好确定事件类型列表是100%平坦、两级层次结构(类型/子类型-这通常是最佳方法)还是N级层次结构(实施起来更难/效率更低,但非常灵活,为适当的企业活动管理提供了非常好的可能性-我参与了所有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). 事件类型:(事件类型,事件子类型,描述,子类型属性1,…) 事件:(事件id、事件类型、事件子类型、时间戳、属性1,…) 事件详细信息:(事件id、标记、int值、varchar值、float值)。 事件详细信息可以标准化为事件详细信息INT、事件详细信息VARCHAR、事件详细信息FLOAT…如果您愿意,但不是真正需要的话

    事件表中的attrib1 atttribN是应用于所有/大多数事件的通用属性,如userid、主机名、pid等

    事件类型是描述分类事件类型/子类型的表

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

    您可能需要另一个辅助表EVENT_TYPE_属性将事件类型映射到事件详细信息的有效标记


  • 示例

    事件:[用户名]在搜索[search string]后单击结果[result number][result id],并获得[number of results]@datetime

    这将产生与此类似的数据(不是实际的SQL语法,sue me:):

    事件类型:(用户操作,用户点击,“用户点击某物”) 事件:(12345,“用户操作”,“用户单击”,“日期时间”,“用户名]”, “应用程序名称”、“pid”…) 事件详细信息:多行: (12345,“结果编号”,33,NULL,NULL)//或进入事件详细信息,不带NULL? (12345,“结果id”,919292,空,空) (12345,“搜索字符串”,NULL,“如何在DB中记录事件”,NULL)
    Stackoverflow说,只是因为你在标题中写了“最佳实践”,这不是对你的问题的分析:)是的,我想,但只是想确保我没有被误解。thnxi很抱歉,我想我有点理解你的想法,我确实喜欢它,只是不确定表0和表1。例如,如果我有一个事件:[用户名]搜索[search string]后点击结果[result number][result id],得到[number of results]@datetime你能更新你的答案吗?我不知道事件类型和事件子类型,特别是什么类型和什么子类型,因此表0什么类型到表1。感谢你提供了一个看起来非常优雅的解决方案。类型可能是USER\u ACTION,子类型可能是USER\u CLICK。但这是R真正依赖于您的问题域,只有您才能真正确定。事件表将获得一个条目(12345,“用户操作”、“用户单击”、“用户名”、“应用程序名称”、“pid”…)和事件详细信息行,如(12345,“结果编号”,33),(12345,“结果id”,919292),等等…-Hopechnox获取此类详细信息!!