Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 哪种NoSQL解决方案适用于简单、基于时间的数据点值?_Php_Database_Nosql - Fatal编程技术网

Php 哪种NoSQL解决方案适用于简单、基于时间的数据点值?

Php 哪种NoSQL解决方案适用于简单、基于时间的数据点值?,php,database,nosql,Php,Database,Nosql,我读了很多关于不同NoSQL数据库的书,但我仍然不确定哪种解决方案最适合我的情况——可能是因为我没有NoSQL数据库的经验——除了我用于缓存的REDIS 在我的场景中,我必须为大约200000个数据点存储基于时间的历史值(混合浮点、整数、基于数据点的布尔值)。通常,每个数据点每15分钟或更短时间将获得一个新值,总计在每年10亿个值的范围内。一些数据点甚至可能每隔几秒钟存储一个值,理论上单个数据点每年最多可存储31536000个值(我们不需要亚秒精度),但这种情况很少见 数据点的数量在未来很容易翻

我读了很多关于不同NoSQL数据库的书,但我仍然不确定哪种解决方案最适合我的情况——可能是因为我没有NoSQL数据库的经验——除了我用于缓存的REDIS

在我的场景中,我必须为大约200000个数据点存储基于时间的历史值(混合浮点、整数、基于数据点的布尔值)。通常,每个数据点每15分钟或更短时间将获得一个新值,总计在每年10亿个值的范围内。一些数据点甚至可能每隔几秒钟存储一个值,理论上单个数据点每年最多可存储31536000个值(我们不需要亚秒精度),但这种情况很少见

数据点的数量在未来很容易翻倍,这意味着它必须是一个可扩展的系统

阅读 要可视化数据,必须能够快速分析任何存储时间范围内单个数据点的数据,可以是几个小时或一整年。在该范围内,我需要特定分辨率的最小/最大/平均值,通常时间范围除以约1000

在mySQL中,可以这样做:

  SELECT TRUNCATE(Timestamp / 3600) AS slot, MIN(value), AVG(value), MAX(value)
    FROM data
    WHERE Timestamp >= [from]
      AND Timestamp < [to]
      AND DatapointID = [some ID]
    GROUP BY 1
选择TRUNCATE(Timestamp/3600)作为插槽、最小(值)、平均(值)、最大(值)
从数据
其中时间戳>=[从]
和时间戳<[to]
和DatapointID=[一些ID]
按1分组
…将返回精度为1小时的图表数据

如何使用NoSQL数据库实现这一点,从而使信息在几毫秒内可用

这是我最关心的问题

书写 数据几乎是实时添加的,所以不应该有太多的写操作。现有数据的更新必须是可能的,但极为罕见。数据会及时分类,但我不能保证这一点

其他必需品
  • 必须能够将所有(或部分)数据快速复制到外部开发机器上,这不需要几个小时。这必须在不影响生产系统的情况下实现
  • 必须能够在不停止数据库的情况下备份所有数据(每日备份)
  • 我们必须导入大约5亿现有数据,这些数据需要在合理的时间内完成
  • 数据库必须可以通过PHP访问

哪个NoSQL数据库最适合这些需求?如何使用它进行上述数据查询?

首先我想到的问题是,为什么它必须是NoSQL数据库?您解释了如何在MySQL中使用它,但没有阅读为什么不想使用它

首先,您建议对MySQl进行以下查询

SELECT TRUNCATE(Timestamp / 3600) AS slot, MIN(value), AVG(value), MAX(value)
    FROM data
    WHERE Timestamp >= [from]
      AND Timestamp < [to]
      AND DatapointID = [some ID]
    GROUP BY 1
ID
from
till
是要填写的值

然后,最难的部分进行聚合。但是有一些文档可以让事情变得简单一点。所以看看&看看我从哪里得到我的信息

但是,组函数将如下所示

{
    _id: 1,
   minValues: {$min: value},
   avgValue: {$avg: value},
   maxValue: {$max: value},
}
  • 注意:不确定
    \u id:1
    是否有效,但需要一个有效列
value
是记录中的列名

现在我们需要完成查询。所以你可以执行它。在结尾处,它将如下所示:

db.articles.aggregate(
    { $match : {
        DatapointID: ID,
        Timestamp: {$gte: from},
        Timestamp: {$lte: till},
    } },
    { $group: {
        _id: 1,
       minValues: {$min: value},
       avgValue: {$avg: value},
       maxValue: {$max: value},
    }}
);

代码未经测试

亨利克的回答非常有道理

你们的数字是合理的,IMHO,但需要非常仔细的设计和选择工具。您没有描述有关f.ex的一些关键要求。在酸性方面,如果你甚至不需要“D”,那么你几乎可以用任何可用的东西都是非常安全的

考虑到你所说的,我提出一些意见:

  • 您可以尝试一些创造性的方法,而不是放弃MySQL上现有的工作,比如IMDB页面版本控制DB,比如IBMsolidDB。它可以很好地扩展,备份可以很容易地进行一些设计,因为您实际上可以在不破坏数据库的情况下将文件拷贝到其他系统(使用全ACID)
  • 我在No/NewSQL中的经验当然仅限于我自己亲身经历过的那些情况,但我所看到的都支持同样的结论:
  • 卡桑德拉在专家手中最容易预测。MongoDB“开箱即用”提供了一个很好的前景,但让它扩大规模可能是一件痛苦的事情。Aerospike是一种功能强大的商业技术(具有alchemyDB背景)。VoltDB/HBase很有前途,但似乎存在一些可伸缩性问题,我不确定它们会出现在哪里(调查不够)
也许你应该有一个“需求表”来决定该怎么做?相信我,NoSQL实现之间存在巨大的差异


干杯,//Jari

我们一开始使用MySQL,但将数据从生产机器复制到开发机器时速度非常慢,对我们的日常增量备份并不友好。同时,它相对较慢(即使对
时间戳
数据点ID
进行了索引)。无论如何,谢谢你的回复。我看过MongoDB,但是我仍然不清楚如何使用MongoDB有效地运行上面的查询。我是否必须在PHP中加载数千条记录并计算最小/最大/平均值并自己分组?希望你能澄清..更新了我的帖子,在mongodb中添加了查询的翻译以及你需要的文档。非常感谢你的更新!不过,还有一个问题:对我来说,您的聚合似乎返回了从/
时间范围的整个
的最小/最大/平均值,但是如果您查看我的SQL查询,我需要返回一些组。示例:假设我的数据库中总共有20亿个数据点值。单个数据点X一年产生100万个值。然后,“用户”需要六个月内每小时的最小/最大/平均值
{
    _id: 1,
   minValues: {$min: value},
   avgValue: {$avg: value},
   maxValue: {$max: value},
}
db.articles.aggregate(
    { $match : {
        DatapointID: ID,
        Timestamp: {$gte: from},
        Timestamp: {$lte: till},
    } },
    { $group: {
        _id: 1,
       minValues: {$min: value},
       avgValue: {$avg: value},
       maxValue: {$max: value},
    }}
);