所有表/实体上是否都有“created_at”和“last_update_at”字段?

💡 原文中文,约1600字,阅读约需4分钟。
📝

内容提要

本文讨论了在表和实体中是否应该添加'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字段用于标记数据的删除状态,便于数据恢复和管理。

🏷️

标签

➡️

继续阅读