用于跟踪项目生命周期事件的数据库结构

时间:2015-01-22 20:21:46

标签: php mysql database

我希望能够跟踪某些项目的生命事件,并能够在过去的任何时间重建其状态以用于视觉目的。这里的“状态”表示几个参数的快照,例如位置,温度和活着/死亡。原始参数值仅在“更改时”记录/输入,并且彼此独立。

我应该如何存储参数更改事件,以便以后能够重建状态

我可以想到两种可能的解决方案:

解决方案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的生物实验网络应用程序)

2 个答案:

答案 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有效的所有不同属性,您将看到每个属性的设置时间