gpt4 book ai didi

database-design - 最佳实践 - 记录事件(一般)和更改(数据库)

转载 作者:行者123 更新时间:2023-12-03 10:42:13 25 4
gpt4 key购买 nike

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

要求:

  • 应该在数据库中
  • 应该可以通过发起者(用户名/ session 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

    等等...

    所以 之前有人处理过这个问题 ?任何 最佳实践 / 您可以分享的链接 ?

    我已经看到它使用上面提到的通用解决方案完成了,但不知何故这与我从数据库设计中学到的东西背道而驰,但是正如您所看到的需要跟踪的事件的绝对数量(每个用户都将能够看到此信息) 让我头疼,但我确实比通用解决方案更喜欢每个表解决方案一个事件。

    有什么想法吗?

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

    谢谢

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

    最佳答案

  • 就插入/删除/更新而言,记录数据库更改,就最佳实践而言,通常由主表上的触发器将条目写入审计表(每个真实表一个审计表,具有相同的列+何时/什么/who 列)。
  • 作为通用列表的事件列表不存在。这实际上是您的应用程序/框架/环境/业务需求的功能。就最佳实践而言,最好确定您的事件类型列表是 100% 平坦、2 级层次结构(类型/子类型 - 这通常是最佳方法)还是 N 级层次结构(更难/更少)实现效率高,但非常灵活,并为适当的企业事件管理提供了非常好的可能性 - 我参与了所有 3 个计划的实现,所以我是从实践中发言的)。
  • 您不需要 1 个表中的 7 个通用 int 字段来存储事件详细信息。而是去标签值对表:

    EVENT_TYPES: (event_type, event_subtype, description, subtype_attr1, ...)
    事件: (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 是适用于所有/大多数事件的通用属性,例如用户 ID、主机名、pid 等...

    EVENT_TYPES 是描述各种事件类型/子类型的表。

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

    您可能需要另一个辅助表 EVENT_TYPE_ATTRIBUTES 将事件类型映射到 EVENT_DETAILS 的有效标签。


  • 示例 :

    事件:[用户名]在搜索[搜索字符串]后点击结果[结果编号][结果ID]并得到[结果数量]@datetime

    这将导致类似于此的数据(不是实际的 SQL 语法,起诉我:):

    EVENT_TYPES: (USER_ACTION, USER_CLICK, "用户点击了某物")
    事件:(12345,“USER_ACTION”,“USER_CLICK”,@datetime,“[用户名]”,
    "app_name", "pid"...)
    EVENT_DETAILS:几行:
    (12345, "result_number", 33, NULL, NULL)//或者进入没有 NULL 的 EVENT_DETAILS_INT?
    (12345, "result_id", 919292, NULL, NULL)
    (12345, "search_string", NULL, "我如何在数据库中记录事件", NULL)

    关于database-design - 最佳实践 - 记录事件(一般)和更改(数据库),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2797592/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com