mysql - 如何设计一个 MySQL 表来跟踪每个资产的状态,以及每个旧状态?
问题描述
我想创建一个表格来跟踪每个资产的状态以及每个过去的状态。基本上我想记录所有状态变化。
我是否为每个更新的状态创建一个时间戳,并让每个更新都有自己的单独行,通过assetid 链接回资产?然后按时间戳排序以按顺序获取这些状态?如果每个资产有大量行并且表格随着时间线性增长,我可以看到这张表格变得笨拙。
这是一个 MySQL 数据库。
解决方案
这是我如何设计数据库表来跟踪/记录目的的示例。
列:
- 自动增加 pk(如果你没有更好的 pk)
- 时间戳
- 跟踪的对象ID(在您的情况下为asset_id)
- 事件类型(可能你不需要,但下面会解释)
- 内容(在您的情况下,这也可以称为状态)
我的示例非常简化,但主要思想是将每条记录插入到自己的行中。您可以创建具有适当主键或索引的表以获得良好的搜索性能。
使用该结构,您应该能够按资产、状态或获取最新更改等进行搜索。该结构取决于您的需求,因此通常我已对其进行修改以支持需求。
不要太在意事件列。我之所以把它放在这里,是因为大多数实现都是基于事件溯源的。这是一篇可以解释它的文章的链接:http: //scottlobdell.me/2017/01/practical-implementation-event-sourcing-mysql/
我建议您可以阅读有关该事件源的更多信息,以了解该设计是否适用于您的情况。仅查看数据库示例,因为这与我的示例类似。
在结果中,您应该有一份状态更改日志。然后取决于您的代码如何处理/读取数据并显示结果。
关于线性增长……我会说这不是一个大问题。当然,如果您有更多信息,“吨行”是什么意思,然后问。我没有看到任何缩放问题。相同的结构非常适用于关系数据库或 NoSQL 数据库。如果数据大小有问题,Mysql 还具有优化这种结构的功能。
推荐阅读
- react-native - React Native SearchBar Invariant Violation 错误'预期的功能,而不是对象的值'
- c# - 从 API 获取 json 对象,使用 C# 修改并发布它
- firebase - 如何解决〜在 null 上调用了 getter 'documentID'。〜?
- angular - Angular 6 与 Angular Material、sweetalert 和 webpack
- android - Firebase 之外的推送通知和电话身份验证服务
- amazon-web-services - Terraform for_each 变量以创建多个 AWS 侦听器规则并设置唯一的 target_group_arn
- python - 如何在python的循环中定义缩进
- powershell - 如何在 powershell 命令行中使用 FTP 将文件上传到 OneDrive
- c# - 从 Azure 服务总线主题读取的 Asp.net Core 2.2
- javascript - 在javascript中修改颜色