以 MySQL 作为示例 DB 来执行此操作(尽管在此阶段我不限于关系风格)和用于模型/数据库交互的 Java 样式语法。
我希望能够在用户编辑对象时允许对各个列值(及其相应类型)进行版本控制。这主要是为了减少频繁编辑复杂对象所需的存储量。
一个简单的例子可能是
- Food (Table)
- id (INT)
- name (VARCHAR(255))
- weight (DECIMAL)
所以我们可以将一个对象插入到数据库中,看起来像......
Food banana = new Food("Banana",0.3);
给我们
+----+--------+--------+
| id | name | weight |
+----+--------+--------+
| 1 | Banana | 0.3 |
+----+--------+--------+
如果我们想更新我们可能使用的权重
banana.weight = 0.4;
banana.save();
+----+--------+--------+
| id | name | weight |
+----+--------+--------+
| 1 | Banana | 0.4 |
+----+--------+--------+
显然,尽管这将覆盖数据。
我可以在这个表中添加一个修订列,它可以随着项目的保存而增加,并设置一个组合 id/version 的复合键,但这仍然意味着为每个修订存储这个对象的所有属性
- Food (Table)
- id (INT)
- name (VARCHAR(255))
- weight (DECIMAL)
- revision (INT)
+----+--------+--------+----------+
| id | name | weight | revision |
+----+--------+--------+----------+
| 1 | Banana | 0.3 | 1 |
| 1 | Banana | 0.4 | 2 |
+----+--------+--------+----------+
但在这种情况下,我们将存储关于每一项的每一条数据。如果用户对文本字段甚至 BLOB 数据可能是对象一部分的较大对象进行较小的修改,则这不是非常有效的。
我真正想要的是能够选择性地离散存储数据,因此权重可以单独保存在单独的数据库中,从而能够引用与其相关的表、行和列。
然后可以将其与表的 VIEW 一起粉碎,这可以将单个列数据的任何后续修订强加到混合中以创建最新版本,但无需为每个小修订存储所有数据。
+----+--------+--------+
| id | name | weight |
+----+--------+--------+
| 1 | Banana | 0.3 |
+----+--------+--------+
+-----+------------+-------------+-----------+-----------+----------+
| ID | TABLE_NAME | COLUMN_NAME | OBJECT_ID | BLOB_DATA | REVISION |
+-----+------------+-------------+-----------+-----------+----------+
| 456 | Food | weight | 1 | 0.4 | 2 |
+-----+------------+-------------+-----------+-----------+----------+
不确定将任何数据作为 blob 存储到然后 CAST 回原始 DTYPE 可能有多成功,但我想既然我在这里发明了功能,为什么不发疯。
这种存储方法也相当危险,因为表名和列名完全可以更改,但希望这至少概述了我正在考虑的那种行为。