我正在创建一个表来存储有关Person的数据。
所需经费如下:
- 动态字段-每个用户可能有不同的数据字段存储。这需要内置的功能,而不需要添加列。
- 跟踪更改-能够跟踪更改并将其还原到特定时间点。
- 出色的性能
- MySQL
我目前的想法是有两个表,一个定义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导致:
{ name: 'John Smith', address: '5 Main St', state: 'CA', phone: '888 777 6666' }
我的挑战是在MySQL中干净地、理想地原生地进行数组合并/替换。
这是一个健壮而优雅的解决方案,还是更好的实现方法?我知道还有其他解决方案,如Mongo,但我们希望在Mysql中保留这一点。
2条答案
按热度按时间cuxqih211#
由于兴趣而投票(主要是“理想地原生于MySQL”部分)。
以下是我个人在生产中的做法,如果它能帮助或让你放心:
我有一个“历史”表:
我认为一个“事件”列省去了很多麻烦。它保存了诸如“创建”/“更新”/“附加”/等事件。当一个条目被“创建”时,它看起来像这样:
当“更新”时,我用数组中的“before”和“after”键保存更改(json是在MySQL 5.7.8+中引入的,我在下面):
这样,我可以在不到几毫秒的时间内打印diffchecks/history页面中可能复杂的编辑,对于任何类型(字符串/整数/布尔值):
vyu0f0g12#
在考虑了一年之后,我倾向于这样做。
喜欢评论/评论
Person
表跟踪Person
s。PersonData
表来跟踪数据。Person
将指向该Person
的最新PersonData
记录。PersonData
将包括persons记录的 * 全部 *。这意味着,每个版本将包括所有数据(而不仅仅是修订)。这将使我们不必查询每个版本并在进行查询时合并它们。PersonData
还会在记录中保留一些元数据:当对数据进行更改时,您只需复制以前的版本,进行更改,创建一个与以前版本不同的JSON PATCH,将版本插入PersonData表,并更新
Person
以引用最新的版本。在查询数据时,只需将
Person
与PersonData
连接起来。本文的H/T:https://www.mongodb.com/blog/post/building-with-patterns-the-document-versioning-pattern