我有一个 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 |
+----+-----+
我正在尝试实施一个修订系统,有点像SO。如果我只是为了Entries Table
我打算只在一个单独的表中保留对该表的所有更改的副本。由于我必须对至少 4 个表执行此操作(TAGS 表不需要进行修订),这看起来根本不是一个优雅的解决方案。
你们会怎么做呢?
请注意,元表被建模为EAV(实体-属性-值).
先感谢您。
您好,目前正在研究类似问题的解决方案,我通过将表分成两个表(控制表和数据表)来解决它。控制表将包含主键和对数据表的引用,数据表将包含自动增量修订键和控制表的主键作为外键。
以您的条目表为例
Entries Table
+----+-------+------+--------+--------+
| id | title | text | index1 | index2 |
+----+-------+------+--------+--------+
becomes
entries entries_data
+----+----------+ +----------+----+--------+------+--------+--------+
| id | revision | | revision | id | title | text | index1 | index2 |
+----+----------+ +----------+----+--------+------+--------+--------+
to query
select * from entries join entries_data on entries.revision = entries_data.revision;
您可以使用插入语句,然后使用条目表的新修订版更新条目表的修订版,而不是更新条目数据表。
该系统的优点是您只需更改条目表中的修订版属性即可移动到不同的修订版。缺点是您需要更新查询。我目前正在将其集成到 ORM 层中,这样开发人员就不用担心编写 SQL 了。我正在考虑的另一个想法是有一个所有数据表都使用的集中修订表。这将允许您使用单个修订号来描述数据库的状态,类似于 Subversion 修订号的工作方式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)