我们有一种情况,我们想经常更改(单个)测量值的标签。 我们的目标是创建一个存储预后值的数据库。但是,它绝不应该丢失数据并跟踪对已写入数据的更改,例如更改或覆盖。
我们当前的计划是要有一个附加字段“ write_ts”,该字段指示在何时插入或更改测量值,以及一个标签“ version”,该标签随每次更改而更新。 此外,版本“ 0”应始终包含最新值。
name: temperature
-----------------
time write_ts (val) current_mA (val) version (tag) machine (tag)
2015-10-21T19:28:08Z 1445506564 25 0 injection_molding_1
因此,我们假设此示例值具有更新的预后值。
所以,我这样做:
SELECT curr_measurement
INSERT curr_measurement with new tag (version = 1)
DROP curr_mesurement
//then
INSERT new_measurement with version = 0
如果我出于某种原因而失去了SELECT,INSERT,DROP之间的连接:
我会得到两次记录。
(或者,如果我执行SELECT,DROP,INSERT:我丢失了数据)
有什么方法可以防止这种情况吗?
答案 0 :(得分:2)
InfluxDB是时间序列数据库,而不是关系数据库。它的主要用例不是用户正在编辑旧数据的情况。
在支持事务的关系数据库中,您正在保护自己免受UPDATE
和类似操作的侵害。数据进入,现有数据被更改,您需要可靠地读取这些更新。
时序数据库的主要用例是大量原始数据传入,然后进行一些过滤或转换为其他度量或数据库。描绘单向数据流。在这种情况下,交易不需要太多,因为旧数据更新得很少。
在像您这样的情况下,根据实时数据要计算其他数据,通常将这些新数据放置在其自己的度量中,而不是将其作为“实时数据”度量中的新字段。
关于版本跟踪和可靠获取更新:
1)version
号是否告诉您write_ts
号没有的信息?如果它只是write_ts
的代理,请考虑不使用它。如果version
仅增加一次,则可能是在复制write_ts
给出的信息,而没有了知道何时进行更改的有用性。如果预计version
会不时减少,那么有必要保留它。
2)同样,如果您保留旧记录:write_ts
是否告诉您time
值没有的任何信息?
3)记录。您是否需要覆盖(更新)值?或者您可以通过添加新行,适当增加write_ts
或version
来获得所需的内容。后者是一种更为“ InfluxDB式”的方法。
4)读取值。您可以读取所有随着更新而更改的值。如果客户端应用仅需要知道要更新的东西的最新值(以及更新时间),查询就变成:
SELECT LAST(write_ts), current_mA, machine FROM temperature
您也可以尝试将机器值分组在一起:
SELECT LAST(*) FROM temperature GROUP BY machine
在InfluxDB中,插入具有相同标签键和时间戳的点会覆盖具有相同字段键的任何现有数据,并添加新的字段键。因此,当重复的条目被写入时,最后一个写入将“获胜” 。
因此,与传统的SELECT, UPDATE
方法不同,它更像SELECT A
,然后在A
上进行计算,然后将结果放入B中,可能带有新的时间戳记INSERT B
就个人而言,我发现InfluxDB具有出色的接受所有方向的数据流的能力,并且其简单的协议和无模式存储意味着添加新数据源几乎是微不足道的。但是,如果我的用例具有定期更新的旧数据,那么我将使用关系数据库。
希望能消除差异。