大部分答案取决于你在收集它后想用它做什么。存储大量数据很容易:只需将其转储到日志文件中,无需数据库。另一方面,如果你想对其进行复杂的分析和数据挖掘,那么数据库是有帮助的。
下一个问题是你要进行什么样的分析。它是否会在具有特定属性的数据子集上执行,仅最后一小时/天/周/月,数据是否可以聚合或以某种方式预先计算?换句话说:您是否需要以收集的形式访问整个数据集?当数据太旧而变得有趣时,您可以存档数据吗?您可以聚合数据并对聚合执行分析吗?
根据我从事广告分析(收集数十亿关于广告曝光的数据点)的经验,聚合是关键。您收集原始数据,对其进行清理,然后将其放入 MongoDB、Cassandra 甚至 MySQL 等数据库中,以便您进行更新和查询。然后您定期汇总数据并将其从数据库中删除(但存档原始数据,您以后可能需要它)。
聚合本质上会询问您想询问的有关数据的所有问题,并将其保存在一种便于检索特定问题答案的形式中。假设您想知道一周中哪一天的 X 最多。这种简单的实现是将所有记录的信号保存在一个巨大的表中,并执行一个查询,将所有具有 X 的行求和。作为收集的数量信号增长这个查询将花费越来越长的时间。再多的索引、分片或优化都无济于事。相反,每天/每小时/每分钟(取决于确切的用例和报告需要的最新程度)您查看您记录的新信号,并且对于每个 X,您递增计数器以跟踪多少X 星期一,如果是星期一,星期二,如果是星期二,等等。这样,您以后可以检索一周中每一天的计数并进行比较。您对所有希望能够回答的问题执行此操作,然后从数据库中删除信号(但同样,保留原始数据)。
记录聚合的数据库类型可以与存储传入信号的数据库类型相同,但不需要很花哨。它将存储代表特定答案的键和通常只是数字的值。
在老式的数据仓库中,存储传入信号的数据库称为 OLTP(用于在线事务处理),存储聚合的数据库称为 OLAP(用于在线分析处理)。OLTP 针对插入进行了优化,OLAP 针对查询进行了优化。这些术语很古老,当人们听到它们时,他们往往会立即想到 SQL 和星型架构等等。也许我不应该使用它们,但它们是方便的术语。
无论如何,对于 OLTP,您需要能够快速插入数据的东西,而且还需要支持索引数据和搜索事物的东西。数据库对聚合有很大帮助,该数据库完成了一半的求和和查找最大值和最小值的工作。我真的很喜欢 MongoDB,因为它很容易设置和使用。我使用的数据往往是杂乱无章的,而且并非所有项目都具有相同的一组属性,因此 Mongo 宽容的无模式是一个福音。另一方面,您的数据听起来更加统一,因此 Mongo 可能不会给您带来那么多好处。不过,不要忽视良好的旧关系数据库。如果你要进行大量的求和等等,那么 SQL 就很棒,这就是它的目的。
对于 OLAP,一些更简单的工作,键值存储就是您所需要的。我使用 Redis 是因为它也很容易使用和设置。它还允许您存储比标量值更多的值,这很方便。有时您的值实际上是一个列表或散列,在大多数键值存储中,您必须对这些值进行编码,但 Redis 会原生处理它。Redis 的缺点是您无法进行查询(“就像给我所有具有此 Y 值的行”),您必须自己保留数据的索引。另一方面,您不需要索引,因为所有问题的答案都已预先计算,您需要做的就是通过问题定义的键查找答案。对于上面的问题,一周中哪一天的 X 最多,您可以查看周一、周二等 X 工作的数量。也许您
总之:MongoDB 和 Redis 非常适合我。我不认为 MongoDB 非常适合您的用例,相反,我认为您实际上可能会从传统的 SQL 数据库中受益更多(但这取决于,如果您的数据真的很简单,您也许可以一直使用 Redis)。最重要的是不要错误地认为您需要将数据保存在一个数据库中并永久保存。聚合和丢弃旧数据是关键。