首页 > 解决方案 > 如何设计一个 MySQL 表来跟踪每个资产的状态,以及每个旧状态?

问题描述

我想创建一个表格来跟踪每个资产的状态以及每个过去的状态。基本上我想记录所有状态变化。

我是否为每个更新的状态创建一个时间戳,并让每个更新都有自己的单独行,通过assetid 链接回资产?然后按时间戳排序以按顺序获取这些状态?如果每个资产有大量行并且表格随着时间线性增长,我可以看到这张表格变得笨拙。

这是一个 MySQL 数据库。

标签: mysqldatabase-design

解决方案


这是我如何设计数据库表来跟踪/记录目的的示例。

列:

  • 自动增加 pk(如果你没有更好的 pk)
  • 时间戳
  • 跟踪的对象ID(在您的情况下为asset_id)
  • 事件类型(可能你不需要,但下面会解释)
  • 内容(在您的情况下,这也可以称为状态)

我的示例非常简化,但主要思想是将每条记录插入到自己的行中。您可以创建具有适当主键或索引的表以获得良好的搜索性能。

使用该结构,您应该能够按资产、状态或获取最新更改等进行搜索。该结构取决于您的需求,因此通常我已对其进行修改以支持需求。

不要太在意事件列。我之所以把它放在这里,是因为大多数实现都是基于事件溯源的。这是一篇可以解释它的文章的链接:http: //scottlobdell.me/2017/01/practical-implementation-event-sourcing-mysql/

我建议您可以阅读有关该事件源的更多信息,以了解该设计是否适用于您的情况。仅查看数据库示例,因为这与我的示例类似。

在结果中,您应该有一份状态更改日志。然后取决于您的代码如何处理/读取数据并显示结果。

关于线性增长……我会说这不是一个大问题。当然,如果您有更多信息,“吨行”是什么意思,然后问。我没有看到任何缩放问题。相同的结构非常适用于关系数据库或 NoSQL 数据库。如果数据大小有问题,Mysql 还具有优化这种结构的功能。


推荐阅读