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

7cjasjjr  于 2023-04-04  发布在  PHP
关注(0)|答案(2)|浏览(148)

我正在创建一个表来存储有关Person的数据。
所需经费如下:

  • 动态字段-每个用户可能有不同的数据字段存储。这需要内置的功能,而不需要添加列。
  • 跟踪更改-能够跟踪更改并将其还原到特定时间点。
  • 出色的性能
  • MySQL

我目前的想法是有两个表,一个定义Person,另一个存储PersonDataPersonData将引用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中保留这一点。

cuxqih21

cuxqih211#

由于兴趣而投票(主要是“理想地原生于MySQL”部分)。
以下是我个人在生产中的做法,如果它能帮助或让你放心:
我有一个“历史”表:

我认为一个“事件”列省去了很多麻烦。它保存了诸如“创建”/“更新”/“附加”/等事件。当一个条目被“创建”时,它看起来像这样:

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

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

vyu0f0g1

vyu0f0g12#

在考虑了一年之后,我倾向于这样做。
喜欢评论/评论
Person表跟踪Person s。
PersonData表来跟踪数据。Person将指向该Person的最新PersonData记录。
PersonData将包括persons记录的 * 全部 *。这意味着,每个版本将包括所有数据(而不仅仅是修订)。这将使我们不必查询每个版本并在进行查询时合并它们。
PersonData还会在记录中保留一些元数据:

  • 记录的时间戳。这样,如果我们想获得某个时间的数据,我们可以很容易地找到相关的记录。
  • 进行创建此修订的更改的用户
  • JSON PATCH允许“审计日志”显示每个版本:修订时间戳、修订用户和更改内容。

当对数据进行更改时,您只需复制以前的版本,进行更改,创建一个与以前版本不同的JSON PATCH,将版本插入PersonData表,并更新Person以引用最新的版本。
在查询数据时,只需将PersonPersonData连接起来。
本文的H/T:https://www.mongodb.com/blog/post/building-with-patterns-the-document-versioning-pattern

相关问题