繁体   English   中英

数据库设计 - 可跟踪和动态实体字段

[英]Database design - Trackable and Dynamic Entity Fields

我正在创建一个表来存储有关一个人的数据。

要求如下:

  • 动态字段——每个用户可能为他们存储不同的数据字段。 这需要内置功能而不需要添加列。
  • 跟踪更改 - 能够跟踪更改并将更改恢复到特定时间点。
  • 很好的表现;很好的绩效
  • MySQL

我目前的想法是有 2 个表,一个用于定义Person ,另一个用于存储PersonData PersonData将引用Person并包含一个 JSON 字段来存储数据,如下所示

PID .... Date ....... Payload
1       1/1/2022     { name: 'John Smith', address: '1 Main St', state: 'NY' }
1       1/2/2022     { address: '5 Main St', state: 'CA' } ---Change address
1       1/3/2022     { phone: '888 777 6666' } ---Add phone

结果将是对 id: 1 的行进行 object 合并/替换,导致:

{ name: 'John Smith', address: '5 Main St', state: 'CA', phone: '888 777 6666' }

我的挑战是在 MySQL 中干净且理想地本地进行数组合并/替换。

这是一个健壮而优雅的解决方案,还是更好的实现方法? 我知道还有其他解决方案,例如 Mongo,但我们希望将其保留在 Mysql 中。

由于兴趣而投票(主要是为了“理想地在 MySQL 中本地化”部分)。

以下是我个人在生产中的做法,如果它可以帮助您或让您放心的话:

我有一个“历史”表:

在此处输入图像描述

我认为“事件”列可以避免很多麻烦。 它包含诸如“创建”/“更新”/“附加”/等事件。 当一个条目被“创建”时,它看起来像这样: 在此处输入图像描述

当“更新”时,我用数组中的“之前”和“之后”键保存更改(json在MySQL 5.7.8+中引入,我在下面):

在此处输入图像描述

这样我就可以在不到几毫秒的时间内在 diffchecks/history 页面中打印可能复杂的编辑,对于任何类型(字符串/整数/布尔值):

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM