所有表/实体上是否都有“created_at”和“last_update_at”字段?
内容提要
本文讨论了在表和实体中是否应该添加'created_at'和'last_update_at'字段的问题,大多数人认为这是一个好做法。文章还提到了使用时间戳的好处,如增量备份、了解错误、缓存逻辑等。作者分享了使用Hibernate Envers进行审计的实践经验。
延伸解读
时间戳字段的实用价值
文章指出,created_at和updated_at字段在多个场景中非常有用。例如,updated_at可用于增量备份,只备份自上次备份后更改的数据;在缓存逻辑中,通过获取查询的最大updated_at来使缓存失效;此外,时间戳还有助于了解错误发生的时间、支持数据导出和轮询系统。这些用途表明,时间戳字段不仅是审计需求,还能提升系统性能和可维护性。
审计与历史记录的实现方式
除了基本的时间戳字段,文章提到使用审计表或Hibernate Envers来记录完整的历史变更。审计表可以跟踪谁在何时创建、更新或删除了什么,甚至记录具体更改的列。Hibernate Envers将审计数据存储在单独的审计模式中,每个条目包含更改类型、时间戳和用户ID。这种方式适合需要严格审计的场景,但静态表可能不需要审计。
推荐的基础字段与软删除
文章建议在所有表中添加五个基础字段:id、created、modified、deleted和archived。其中deleted字段用于软删除,避免直接删除数据,便于恢复;archived字段用于历史记录或数据迁移。这种设计可以应对大多数情况,即使初期认为不需要,也能为未来变化预留空间。软删除结合状态字段(如0表示删除,1表示实时)在实践中帮助恢复了误删数据。
事件溯源视角的补充
文章末尾的注释指出,这种为所有表添加时间戳和审计字段的做法,实质上是变相实现事件溯源。事件溯源强调以事件序列记录状态变化,而created_at、updated_at以及审计表正是记录了数据变更的时间点和内容。虽然这不是完整的事件溯源,但为系统提供了可追溯的历史,有助于冲突解决、错误修复和数据排序。
Q&A
为什么在表中添加created_at和updated_at字段是一个好做法?
添加这些字段可以帮助进行增量备份、了解错误、缓存逻辑和数据导出等操作。
使用Hibernate Envers进行审计有什么优势?
Hibernate Envers可以记录更改类型、时间戳和用户ID,帮助追踪数据的历史记录。
在所有表中应该包含哪些基本字段?
建议包含ID、created、modified、deleted和archived等字段。
updated_at字段如何帮助缓存管理?
updated_at字段可以获取特定查询的最大更新时间,从而有效管理缓存失效。
如何使用时间戳解决公司环境中的冲突?
时间戳可以帮助跟踪数据的更改历史,支持错误修复和数据排序,减少冲突的发生。
在使用软删除时,deleted_at字段的作用是什么?
deleted_at字段用于标记数据的删除状态,便于数据恢复和管理。