保持页面更改历史记录.有点像SO做修订

Fra*_*kie 10 mysql database version-control revision entity-attribute-value

我有一个CMS系统,可以跨表格存储数据,如下所示:

Entries Table
+----+-------+------+--------+--------+
| id | title | text | index1 | index2 |
+----+-------+------+--------+--------+

Entries META Table
+----+----------+-------+-------+
| id | entry_id | value | param |
+----+----------+-------+-------+

Files Table
+----+----------+----------+
| id | entry_id | filename |
+----+----------+----------+

Entries-to-Tags Table
+----+----------+--------+
| id | entry_id | tag_id |
+----+----------+--------+

Tags Table
+----+-----+
| id | tag |
+----+-----+
Run Code Online (Sandbox Code Playgroud)

我正在尝试实施修订系统,有点像SO.如果我只是因为Entries Table我正在计划在一个单独的表中保留该表的所有更改的副本.因为我必须为至少4个表(TAGS表不需要修改)这样做,这似乎不像一个优雅的解决方案.

你们会怎么做?

请注意,元数据表是以EAV(实体属性值)建模的.

先感谢您.

ejr*_*ley 8

您好我正在解决类似的问题,我通过将我的表分成两个,一个控制表和一个数据表来解决它.控制表将包含主键和数据表的引用,数据表将包含自动增量修订键和控制表的主键作为外键.

以您的条目表为例

Entries Table
+----+-------+------+--------+--------+
| id | title | text | index1 | index2 |
+----+-------+------+--------+--------+
Run Code Online (Sandbox Code Playgroud)

entries             entries_data
+----+----------+   +----------+----+--------+------+--------+--------+
| id | revision |   | revision | id |  title | text | index1 | index2 |
+----+----------+   +----------+----+--------+------+--------+--------+
Run Code Online (Sandbox Code Playgroud)

查询

select * from entries join entries_data on entries.revision = entries_data.revision;
Run Code Online (Sandbox Code Playgroud)

而不是更新entries_data表,而是使用insert语句,然后使用条目表的新修订更新条目表的修订版.

此系统的优点是只需更改条目表中的revision属性即可移至不同的修订版.缺点是您需要更新查询.我目前正在将其集成到ORM层中,因此开发人员无需担心编写SQL.我想要的另一个想法是有一个集中的修订表,所有数据表都使用.这将允许您使用单个修订号描述数据库的状态,类似于subversion修订号的工作方式.


Edw*_*ams 6

看看这个问题:如何版本控制数据库中的记录

为什么不为每个表都有一个单独的history_table(根据链接问题上接受的答案)?它只是原始表的PK和修订号的复合主键.毕竟,您仍然需要将数据存储在某个地方.