我希望能够跟踪某些项目的生命事件,并能够在过去的任何时间重建其状态以用于视觉目的。这里的“状态”表示几个参数的快照,例如位置,温度和活着/死亡。原始参数值仅在“更改时”记录/输入,并且彼此独立。
我应该如何存储参数更改事件,以便以后能够重建状态?
我可以想到两种可能的解决方案:
解决方案1:“快照”表
+----------+-------------+------+------+
| Location | Temperature | Dead | Time |
+----------+-------------+------+------+
| A | + | 0 | 001 |
+----------+-------------+------+------+
| A | - | 0 | 002 |
+----------+-------------+------+------+
| B | + | 0 | 005 |
+----------+-------------+------+------+
在参数更改时,状态本身会更新并存储。获取某个项目的状态就像获取一行一样简单。
这正是我所需要的,除了:
解决方案2:录制事件
表存储单个参数/更改,而不是完整的shapshot。
+----+-----------+------------+------+
| ID | EventType | EventValue | Time |
+----+-----------+------------+------+
| 1 | loc | A | 001 |
+----+-----------+------------+------+
| 2 | temp | + | 001 |
+----+-----------+------------+------+
| 3 | temp | - | 002 |
+----+-----------+------------+------+
| 4 | loc | B | 005 |
+----+-----------+------------+------+
| 5 | temp | + | 005 |
+----+-----------+------------+------+
虽然此解决方案比第一个解决方案更灵活,但重建快照存在问题。例如,如何在尽可能少的数据库查询中有效地检查004时的温度,位置和可行性是什么?
此问题还有其他解决方案吗?
(P.S。这是一个使用php + Doctrine2 + MySQL的生物实验网络应用程序)
答案 0 :(得分:0)
你的第二个解决方案看起来很稳固。还有其他组织数据的方法,例如字段级修订表,这是一种比您现有的结构更多的结构。
使用第二个解决方案,您可以使用子查询在一个查询中获取快照。我认为这是“只需要完成”并且不依赖于最有效的查询。
SELECT * FROM (
SELECT * FROM event
WHERE time >= '003'
ORDER BY Time DESC) AS temp
GROUP BY EventType;
答案 1 :(得分:0)
使用解决方案2 ,您可以轻松获得所需的一切:
SELECT DISTINCT (t1.eventType),t1.eventValue, t2.*
FROM `events` AS t1
LEFT JOIN
(SELECT eventtype, max(time) AS time
FROM events
WHERE events.`time`<='004'
GROUP BY eventtype ) AS t2
ON t1.eventType=t2.eventType
WHERE t1.time=t2.time
因此,此查询将返回对时间004有效的所有不同属性,您将看到每个属性的设置时间