我应该将记录信息存储在主数据库表中吗?

时间:2010-05-14 13:10:45

标签: database-design database-independent

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

谢谢。

8 个答案:

答案 0 :(得分:5)

如果您认真考虑保留审核信息,则应将其放在单独的表格中。最后更新的东西将被覆盖,这是无可替代的。如果您为密钥添加时间戳,那么您可以将历史记录保存在同一个表中,但代价是使查询更加昂贵并且应用程序逻辑更复杂,所以我建议不要这样做。

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

不久说最好放在一张单独的表格中。

答案 3 :(得分:3)

您必须始终将操作数据库(有关产品,客户等的当前信息)与日志存储分开。根据具体情况,我还建议您创建一个“历史”数据库,并存储所有遗留数据,以免超重运营数据库。在大型数据库上进行选择总是很慢,因此必须以任何可能的方式减小其大小并创建索引以提高性能。记录信息应存储在其他一些数据库中。像“Last Modified By”这样的字段我不认为是记录信息,你可以在任何你想要的表上使用它们。我还建议您在操作数据库上没有太多的外键(存储您的日志信息而不直接参考操作数据),因为它也会减慢您的数据管理速度。

希望它有所帮助。

答案 4 :(得分:1)

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

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:1)

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

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

答案 7 :(得分:1)

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

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

相关问题