【问题标题】:Should I store logging information in main database table?我应该将日志信息存储在主数据库表中吗?
【发布时间】:2010-05-14 21:55:26
【问题描述】:

例如,假设我有一张产品表。我应该存储日志信息,例如它的创建者、最后编辑者、最后更新日期……还是如果日志信息与实际应用程序无关,我应该将日志信息分隔在一个审计表中?

谢谢。

【问题讨论】:

    标签: database-design database-independent


    【解决方案1】:

    如果您认真考虑保留审计信息,则应将其放在单独的表格中。最后更新的东西只会被覆盖,它不能替代。如果为键添加时间戳,则可以将历史记录保存在同一个表中,但代价是查询成本更高,应用程序逻辑更复杂,因此我建议不要这样做。

    【讨论】:

      【解决方案2】:

      我通常会在每个表中保留 LastChangeUser 和 LastChangeDate 列信息,有时还会包括 CreateUser 和 CreateDate。这通常对大多数桌子都有好处。

      但是,如果您需要存储更多,对于非常重要的表(通常与金钱相关),请转到另一张表。在该表 (OriginalTableName_History) 中,我通常有一个 HistoryID,它是一个自动增量、一个 HistoryDate 和一个 HistoryType(I=insert、U=update、D=delete),然后是原始表中的所有列。我通常会在主表上设置一个触发器,将所有更改(插入/更新/删除)放入历史记录表中。

      【讨论】:

        【解决方案3】:

        简而言之,最好放在单独的表中。

        【讨论】:

          【解决方案4】:

          您必须始终将您的操作数据库(有关产品、客户等的当前信息)与日志存储区分开来。根据具体情况,我还建议您创建一个“历史”数据库,并将所有遗留数据存储在那里,以免过度使用操作数据库。在大型数据库上执行选择总是很慢,因此您必须以任何可能的方式减小它的大小并创建索引以提高性能。日志信息应存储在其他数据库中。我不认为“上次修改者”之类的字段是日志信息,您可以将它们放在您希望的任何表上。我还建议您在操作数据库上不要有太多外键(存储您的日志信息而不直接引用操作数据),因为它也会减慢您的数据管理速度。

          希望对你有帮助。

          【讨论】:

            【解决方案5】:

            这取决于您的应用程序以及您节省了多少信息。一些框架(例如 Ruby on Rails)可以自动更新 created_by 等字段,因此如果您具有这种灵活性并且只需要几个字段,那么将其保存在同一个表中可能会更容易。

            但是,如果您要记录详细信息,例如谁在什么时间更改了记录,单独的表格可能会更好。这样,您甚至可以保留对记录所做的所有更改的滚动历史记录,以供审计之用。

            【讨论】:

              【解决方案6】:

              您记录的有关每种产品的元数据集是否可能会增长?如果是这样,请将其放在另一个表中,以便您可以添加项目。

              如果它是一个不会增长的具体集合,那么它可能无关紧要。通过使用单独的表格,您获得了一些概念上的优雅,但您放弃了少量的效率和复杂性。

              【讨论】:

                【解决方案7】:

                我会把它分开,特别是如果你想保持审计跟踪。使用您的实体登录意味着每个实体只能有一个日志记录条目。它还混合了不同的关注点 - 对实体的更改和实体本身是不同的概念,最好放在单独的表中。

                使用组合表,删除实体将删除该实体的所有审计信息,这可能不是您想要的。

                【讨论】:

                  【解决方案8】:

                  如果您的应用程序只需要知道产品的当前属性是什么,那么将审计信息放在另一个表中是合适的,因为它可以简化查询并提高性能。

                  另一方面,如果您需要能够在特定时间点重建实体(例如,如果您的应用程序经常需要能够回答“我们在 2004 年以什么品牌销售此产品? ") 你应该永远不要更改记录:对实体的更改是实体数据的一部分,应该在同一个表中。 (参见 Martin Fowler 的文章“Patterns for things that change with time”,在面向对象的上下文中对此进行了很好的讨论。)

                  【讨论】:

                    猜你喜欢
                    • 2014-11-26
                    • 2015-09-12
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多