每隔给定时间插入一行,否则更新上一行(Postgresql,PHP)

时间:2013-05-21 20:09:44

标签: php c++ apache postgresql upsert

我有多个设备(11个具体),每秒发送一次信息。这个信息在一个apache服务器中收到,由一个PHP脚本解析,存储在数据库中,最后显示在一个gui中。 我现在正在做的是检查是否存在当前日期的行,如果不存在则创建新行,否则更新它。 我这样做的原因是因为我需要从数据库中轮询信息并将其显示在c ++应用程序中,以使其看起来像实时;如果我每次设备发送信息时都要创建一行,处理和读取数据将占用大量的时间以及系统资源(内存,CPU等),这使得数据显示不太真实 - 时间。 我编写了一个报告生成工具,它可以获取每天的信息(从00:00:00到23:59:59)并将其放在Excel电子表格中。

我的问题基本上是:

  • 是否可以直接在数据库服务器中执行插入/更新部分,还是必须在php脚本中执行逻辑?

  • 在不降低显示设备性能的情况下,是否有更好(更有效)的方式存储信息?

  • 关于报告生成,如果我想采样间隔,可以说从昨天的15:50:00开始到今天12:45:00结束,我的当前数据结构无法完成,那么做什么呢我需要考虑制作一个允许我创建此类查询的数据结构。

我使用的组件:     - Apache 2.4.4     - PostgreSQL 9.2.3-2     - PHP 5.4.13

3 个答案:

答案 0 :(得分:1)

我的建议 - 只存储您的设备正在发送的所有信息。使用适当的索引和查询,您可以非常快速地从DB处理和检索信息。

对于你的问题:

是的,可以使用SQL,PL / pgSQL,PL / PHP,PL / Java,PL / Py以及Postgres内置的许多其他语言在Postgres DB中构建您想要的任何逻辑。

正如我之前所说的那样 - 正确的索引可以做出魔术。

如果使用全表无法获得所需的查询速度 - 您可以为每个设备创建一个包含1行的小表。并在此表中保留最后的已知值,以便在sort of real-time中显示它们。

答案 1 :(得分:1)

1)该技术称为upsert。在PG 9.1+中,可以使用wCTE(http://www.depesz.com/2011/03/16/waiting-for-9-1-writable-cte/

完成

2)如果您真的希望它是实时的,您应该将数据直接发送到应用程序,如果您只关心最后几个值,将其存储在内存或纯文本文件中也会更快。但PG确实有收听/通知频道,所以你的滞后可能只有100-200 mili而且你不应该只是显示它。

答案 2 :(得分:0)

我认为鉴于您所描述的过程,您高估了内存系统要求。每秒(或每秒11个)添加一行数据并不是一大堆资源。事实上,UPDATE与ADD新行相比可能更耗时。此外,如果向表中添加TIMESTAMP,则排序操作非常快。只需每天一次添加一些垃圾收集处理作为CRON作业(删除旧数据),你就是黄金。

但是要回答你的问题:

  

是否可以直接在数据库服务器中执行插入/更新部分,或者我是否必须在php脚本中执行逻辑?

使用数据库引擎编写逻辑通常不是很直接。为了保持简单,坚持使用php脚本中的逻辑。 UPDATE(或)INSERT INTO表SET var1 ='assignment1',var2 ='assignment2'(WHERE id ='checkedID')

  

是否有更好(更有效)的方式来存储信息而不会降低显示设备的>性能?

很难回答,因为您尚未描述显示设备的连接性。有更有效的方法来完成这个过程,但没有一个具有这种频繁更新所需的锁定机制。

  

关于报告生成,如果我想采样间隔,可以说从昨天15:50:00开始到今天12:45:00结束,我的当前数据>结构无法完成,那么什么我是否需要考虑制作一个允许我创建此类查询的数据结构。

您可以使用TIMESTAMP变量类型。这将包括UPDATE操作的DATE和TIME。然后它只是一个在数据库查询中使用DATE函数的简单WHERE子句。