需要建议:这是一个’NoSQL’数据库的好用例吗? 如果是这样,哪一个?

我最近一直在研究NoSql选项。 我的方案如下:

我们从世界各地的远程位置收集和存储来自定制硬件的数据。 我们每15分钟记录一次每个站点的数据。 我们最终希望每1分钟一次。 每条记录有20到200个测量值。 设置硬件记录并每次报告相同的测量值。

我们面临的最大问题是我们从每个项目中获得一组不同的测量结果。 我们测量大约50-100种不同的测量类型,但是任何项目都可以具有任何数量的每种类型的测量。 没有可以容纳数据的预设列集。 因此,我们在系统上设置和配置项目时,使用所需的确切列创建和构建每个项目数据表。

我们提供工具来帮助分析数据。 这通常包括更多计算和数据聚合,其中一些我们也存储。

我们目前正在使用一个mysql数据库,每个客户端都有一个表。 表之间没有关系。

NoSql似乎很有希望,因为我们可以存储project_id,时间戳,然后其余的不会被预设。 这意味着一个表,数据中的更多关系,但仍然处理各种测量。

‘NoSql’解决方案适合这项工作吗? 如果是这样的?

我一直在调查MongoDB,看起来很有希望……

澄清示例:

项目1记录了5个数据点,mysql表列如下:时间戳,温度,风速,降水,辐照度,风向

项目2有3个数据点记录mysql表列:timestamp,temp,irradiance,temp2

简单的答案是,对这些问题没有简单的答案,找出适用于您的方案的唯一方法是将研发时间投入其中。

这个问题很难回答,因为OP没有详细说明性能要求。 对于许多客户来说,写入率为num_customers * 1minute(低)似乎是75M /年的记录,但我没有所需读取/查询性能的数据。

实际上,您已经使用水平分区创建了一个分片数据库,因为您将每个客户存储在一个单独的表中。 这很好,会提高性能。 但是,您尚未确定性能问题,因此需要先测量并评估问题大小,然后才能解决问题。

NoSQL数据库确实是修复传统RDBMS性能问题的好方法,但它不会提供自动标量,也不是一般解决方案。 您需要找到性能问题修复程序,然后设计(nosqL)数据模型以提供解决方案。

根据你想要实现的目标,我会看看MongoDB , Apache Cassandra , Apache HBase或Hibari 。

请记住,NoSQL是一个模糊的术语,通常包含在内

  • 在读取或写入时性能密集的应用程序。 通常以牺牲另一个为代价来牺牲读写性能。
  • 分布和可扩展性
  • 不同的持久性方法(RAM /磁盘)
  • 更加结构化/定义的访问模式使得即席查询更加困难。

因此,在第一个实例中,我将看到传统的RDBMS是否可以使用所有可用的技术实现所需的性能,获得高性能MySQL的副本并阅读MySQL性能博客 。

REV1:

根据您的意见,我认为可以说您可以使用上述NOSQL引擎之一实现您想要的function。

我的主要建议是设计和实施您的数据模型,目前您正在使用的内容并不正确。

因此,请看实体属性值模型,因为我认为它完全适合您的需求。

在考虑使用哪种技术之前,您需要正确地获取数据模型,诚实地动态修改模式不是数据模型。

我使用传统的SQL数据库来validation和测试新的数据模型,因为管理工具更好,并且在细化数据模型时通常更容易使用模式。

好吧,我可能会因为没有直接回答你的问题而受到抨击,但无论如何我会说它,因为我认为这是你应该考虑的事情。 我没有NOSQL数据库的经验,所以我不推荐一个,但就关系数据库而言,可能有更好的设计适合您的情况。

首先 – 每个客户删除1个表。 相反,我会构建一个多对多的架构,其中会有以下表格:

  • 顾客
  • MeasurementTypes
  • 测量

Customers表将包含客户信息和唯一的CustomerID字段:

CustomerID | CustomerName | ..and other fields --------------------------------------------------------------------- 

MeasurementTypes表将描述您支持的每种测量类型,并指定一个唯一名称(MeasurementType字段)来引用它:

  MeasurementType | Description | ..and other pertinent fields --------------------------------------------------------------------- 

Measurements表是汇总所有数据的地方。 您将为每个收集的数据点记录一条记录,标记客户ID,测量类型,时间戳和唯一的“批次”标识符(以便能够将每个测量的数据点组合在一起) – 当然还有测量值。 如果您需要不同类型的测量值,您可能需要对设计有一点创意,但很可能测量值都可以用单一数据类型表示。

  Customer | MeasurementBatch | MeasurementType | Timestamp | Value | -------------------------------------------------------------------------------- 1 | {GUID} | 'WIND_SPEED' | ... | ... -------------------------------------------------------------------------------- | | | | | 

这样,您可以拥有一个非常灵活的设计,允许您为每个客户独立地为其他客户添加尽可能多的数据点。 而且你从关系数据库中获益。

如果您的SQL引擎支持此function,您甚至可以按客户列对Measurements表进行分区。

希望这可以帮助..

编辑

我必须提一下,我与微软没有任何关系,也没有尝试给他​​们免费广告 – 事实上,我最熟悉他们的SQL服务器。

根据Alan的评论 – 关于SQL数据库是否可以支持每年几千万条记录的数据量,每年可能增长到10亿条记录 – 有一个很好的MS SQL服务器可用限制/规范摘要这里:

http://msdn.microsoft.com/en-us/library/ms143432.aspx

似乎每个表可以拥有多少条记录的唯一限制是磁盘上的可用大小(如果您想要对该数据运行某些报告,则可能是RAM)。

FWIW:经过一年半的工作和扩展MySQL中的EAV架构,我们得到了我们的选择:

  1. 将DB移动到昂贵的裸机设置。
  2. 重新调查NoSQL解决方案。

我们最终选择了Cassandra并使用了一个受OpenTSDB项目影响很大的模式。

Cassandra是存储时间序列数据的一个非常强大的选择,并且很好地满足了我们的要求。

我假设如果你有很多客户,你最终会有很多表。 我将首先删除此限制并转移到单个表模型或具有适当关系的客户端和数据表。 这样你就可以保留mysql。 不要以为mysql对一切都不好。

就NOSQL而言,这取决于您的数据模型和使用模式,但如果您拥有大量客户端并且您更喜欢此模型,那么couchdb视图可以解决该问题,因为couchdb可以支持数千个视图。 您可以将所有数据存储在couchdb中的一个数据库中,但每个客户端都有一个视图。 我不知道mongodb如何解决这个问题。