1

我正在深入修改一些我没有编写的旧日志记录代码,并想知道您对此有何看法。这是一个用 PHP 和 MySQL 编写的事件记录器,它记录如下消息:

Sarah added a user, slick101
Mike deleted a user, slick101
Bob edited a service, Payment

分解成这样:

Sarah [user_id] added a user [message], slick101 [reference_id, reference_table_name]

变成这样的表:

log
---
id
user_id
reference_id
reference_table_name
message

请注意,上述示例消息中的“Bob”和“Payment”是其他表的 ID,而不是实际名称。需要连接才能获取名称。

看起来“reference_table_name”是为了在正确的表中找到正确的名称,因为只存储了reference_id。如果我能以某种方式加入存储在 reference_table_name 中的表名,这可能会很好,如下所示:

select * from log l
join {{reference_table_name}} r on r.id = l.reference_id

我想我明白了他在这个表格布局中的用途——拥有用于统计的 id 而不是将整个消息存储在单个列中(这将需要文本解析)要好得多。现在我想知道..

有没有更好的方法或者是否有可能以某种方式进行虚构加入?

干杯

4

1 回答 1

1

要基于建模获得连接,您将看到一个两阶段的过程:

  1. 从 LOG 获取特定消息的表名
  2. 通过将实际查询构造为字符串来使用动态 SQL。IE:

    "SELECT l.* FROM LOG l JOIN "+ tableName +" r ON r.id = l.reference_id"

记录删除没有太多价值,因为没有要加入的记录来查看删除的内容。

应用程序需要多少历史记录?

您是否需要知道过去数月/数年的价值是谁做了什么?如果需要记录,则应将其归档并从表中删除。如果您不需要所有历史记录,请考虑在每个表上使用以下审计列:

  • ENTRY_USERID,不为空
  • ENTRY_TIMESTAMP,日期,不为空
  • UPDATE_USERID,不为空
  • UPDATE_TIMESTAMP,日期,不为空

这些列可让您知道谁创建了记录和时间,以及最后一次成功更新记录的人以及时间。我会根据具体情况创建审计表,这取决于用户需要什么功能。

于 2009-07-25T20:19:41.357 回答