【问题标题】:Database design for sensor capturing. NoSQL vs SQL用于传感器捕获的数据库设计。 NoSQL 与 SQL
【发布时间】:2016-05-27 09:55:54
【问题描述】:

我正在努力设计一个快速查询数据库。 我有几家工厂每 2 秒从 50 到 500 个传感器捕获数据,并将每个传感器的数据存储在 ROWS 中。 您可以想象每天和工厂的数据量从 2,16M 到 21,6M 行。 我必须使用 .NET,这部分我无法更改。

到目前为止,数据存储在每个工厂的 SQL Server Express 08R2 中,然后每小时发送到主服务器 SQL Server 08R2,并存储在每个工厂的单独数据库中。现在使用的设计是:

CREATE TABLE [dbo].[CalculatedValues](
    [ID] [int] IDENTITY(1,1) NOT NULL, -- not useful at all.
    [Date] [datetime] NOT NULL,
    [Var] [varchar](20) NOT NULL,
    [Value] [varchar](15) NOT NULL,
    CONSTRAINT [PK_CalculatedValues] PRIMARY KEY NONCLUSTERED 
    ( [ID] ASC )WITH (...) ON [PRIMARY] 
) ON [PRIMARY]

CREATE UNIQUE CLUSTERED INDEX [IX_CalculatedValues_Date_Var] ON [dbo].[CalculatedValues] 
    ( [Date] DESC, [Var] ASC )WITH (...) ON [PRIMARY]

值可以是 DECIMAL 或 BIT(boolean),因此该部分也可能发生变化。

桌面应用程序在某种程度上运行良好,必须在过去三个月的最坏情况下生成报告。 (大约需要 3 分钟)

现在需要一个 Web 应用程序,您可以想象必须以毫秒而不是秒为单位生成报告。由于用户可以选择从 X 到 Y 的日期,因此无法预先生成报告。

我正在考虑跟上 SQL Server 或更改为单节点 Cassandra(即使知道 3 个节点是发挥 Cassandra 优势的最低要求)。

我的问题是:我该如何重新设计它? 无法对值进行分组,因此无法应用规范化。 我正在考虑这样的事情:

TABLE CalculatedValues(
    Date datetime PK,
    ValueSensor01 DECIMAL,
    ValueSensor02 BIT,
    ValueSensor03 DECIMAL,
    ....
)

但是从近 4M 行中提取 300/500 列的速度有多快?在 NoSQL(Cassandra 或任何其他兼容 .NET)或 SQL Server 中会更快吗?

我接受各种建议。

非常感谢。

EDIT01:查询仅按 DATE 和 Var 进行,如您在声明的索引中所见。每个工厂都有不同类型的查询,因为几乎所有传感器都不同。

【问题讨论】:

  • 对于问答格式来说太宽泛了。
  • 我认为“现在需要一个 Web 应用程序,您可以想象必须以毫秒而不是秒为单位生成报告”的说法是错误的。有许多 Web 应用程序需要一些时间才能返回响应,如果您使用“正在计算...”、“可用结果”模式,这很好。我有一个应用程序,它通过网络表单接受报告请求并将结果通过电子邮件发送,因为这对请求报告的人最有用。
  • 您需要指定您的查询。 如何你想获取数据?通过 sensor_id 和日期范围?仅按范围,无论传感器 ID 是什么?等等...
  • Google 的一些条款:流式数据库;过程历史学家;时间序列数据。有许多软件工具和技术可以精确地支持您的场景。
  • 感谢您的回复。我会进一步研究并提出和反馈最新的解决方案。

标签: asp.net sql-server database-design cassandra nosql


【解决方案1】:

我现在同时使用 Azure SQL 和 DocumentDB (noSQL)。 我说的是 DocumentDB,但我认为它与其他 .Net NoSQL 提供程序大致相同。

有我的见解:

  1. 使用 documentDB 插入速度要快 WAAAAY(即使 documentDB 是 S1 层(最便宜)并且 SQL 是 Premium 1(最昂贵的之一))
  2. 从 DocumentDB 检索 1 个文档速度很快。检索倍数,很长.. 很长
  3. 无法在 DocumentDB 中以日期时间格式存储日期(我们正在使用“Epoch”黑客攻击:使用自定义 JsonDesirializer 存储 unix 时间戳)
  4. 无法更新 documentDB 中的文档(您需要使用“替换文档”)
  5. LinQ for DocumentDB 有很多限制

根据您的需要,我将使用 Azure SQL 的高级 (p1-p2)。如果是预置的,肯定是 SQL。只需调整索引并确保使用 SSD,数据就会流动。 (经验法则:如果可能,您需要与最大数据库一样多的 RAM)

编辑:对于报告部分:存储过程和缓存是一种方法。从 EntityFramework 存储过程将我们的应用程序的加载时间从 40 秒缩短到 2 秒

【讨论】:

  • 感谢您的回答。我会尝试其中的一些并在此处提供反馈。
猜你喜欢
  • 2021-09-06
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 2012-12-08
  • 1970-01-01
  • 2015-12-08
  • 2020-03-06
  • 1970-01-01
相关资源
最近更新 更多