Database design 我应该在主数据库表中存储日志信息吗?

Database design 我应该在主数据库表中存储日志信息吗?,database-design,database-independent,Database Design,Database Independent,例如,假设我有一个产品表。我是否应该存储日志信息,如创建人、上次编辑人、上次更新日期等。。。或者,如果日志信息与实际应用程序无关,我应该在审计表中分离日志信息吗 谢谢。我很快就会告诉你,最好是在一个单独的表格中。我会把它分开,特别是如果你想保持审计跟踪的话。使用实体登录意味着每个实体只能有一个日志条目。它还混合了不同的关注点——对实体和实体本身的更改是不同的概念,最好放在不同的表中 对于组合表,删除实体将删除该实体的所有审核信息,这可能不是您想要的。这取决于您的应用程序和保存的信息量。一些框架,

例如,假设我有一个产品表。我是否应该存储日志信息,如创建人、上次编辑人、上次更新日期等。。。或者,如果日志信息与实际应用程序无关,我应该在审计表中分离日志信息吗


谢谢。

我很快就会告诉你,最好是在一个单独的表格中。

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


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

这取决于您的应用程序和保存的信息量。一些框架,比如RubyonRails,可以自动更新诸如created_by之类的字段,因此如果您具有这种灵活性,并且只需要几个字段,那么您可能更容易将其保存在同一个表中


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

如果您真的想保留审计信息,它应该放在单独的表中。最后更新的内容将被覆盖,无法替代。如果向键添加时间戳,则可以将历史记录保存在同一个表中,但代价是使查询更昂贵,应用程序逻辑更复杂,因此我建议不要这样做。

您记录的关于每个产品的metatdata集可能会增加吗?如果是,请将其放在另一个表中,以便可以添加项目


如果它是一个不会生长的混凝土集,那么它可能并不重要。通过使用一个单独的表,您可以获得一些概念上的优雅,但您会放弃少量的效率和复杂性。

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


另一方面,如果您需要能够在特定时间点重建实体(例如,如果您的应用程序通常需要能够回答“2004年我们以什么品牌销售此产品?”)您不应该更改记录:对实体的更改是实体数据的一部分,应该在同一个表中。(请参阅Martin Fowler的文章“”,了解在面向对象上下文中对此的详细讨论。)

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


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

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

希望能有帮助