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

时间:2010-09-24 17:17:20

标签: ruby-on-rails ruby database nosql

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

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

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

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

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

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

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

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

澄清示例:

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

Project 2有3个数据点记录了mysql表列: 时间戳,温度,辐照度,temp2

4 个答案:

答案 0 :(得分:4)

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

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

有效地,您已经使用sharded建立了horizontal partitioning数据库,因为您将每个客户存储在一个单独的表中。这很好,会提高性能。但是,您尚未确定存在性能问题,因此需要先测量并评估问题大小,然后再进行修复。

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

根据您要实现的目标,我会查看MongoDBApache CassandraApache HBaseHibari

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

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

因此,在第一个实例中,我会看到传统的RDBMS是否能够使用所有可用技术实现所需的性能,获取High Performance MySQL的副本并阅读MySQL Performance Blog

修订版1:

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

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

所以请看Entity-attribute-value model因为我认为它完全适合您的需要。

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

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

答案 1 :(得分:2)

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

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

  • 客户
  • MeasurementTypes
  • 测量

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

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

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

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

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

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

通过这种方式,您可以拥有一个非常灵活的设计,允许您为每个客户独立地为其他客户添加尽可能多的数据点。并且您可以获得关系数据库的好处..

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

希望这会有所帮助..

修改

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

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

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

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

答案 2 :(得分:0)

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

  1. 将数据库移至昂贵的裸机设置。
  2. 重新调查NoSQL解决方案。
  3. 我们最终选择了Cassandra并使用了一个受OpenTSDB项目影响很大的架构。

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

答案 3 :(得分:-1)

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

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