传感器捕获的数据库设计。 NoSQL vs SQL

时间:2016-02-16 08:17:22

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

我正在努力设计一个快速查询数据库。 我有几个工厂每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(布尔值),因此该部分也可能会改变。

它在某种程度上适用于桌面应用程序,必须在过去三个月的最坏情况下生成报告。 (大约需要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进行。每个工厂都有不同类型的查询,因为几乎所有传感器都不同。

1 个答案:

答案 0 :(得分:0)

我现在正在使用Azure SQL和DocumentDB(noSQL)同时工作。 我在谈论DocumentDB,但我认为它与其他.Net NoSQL提供商不同。

有我的见解:

  1. 使用documentDB更快地插入WAAAAY(即使documentDB是S1层(最便宜),SQL也是Premium 1(最贵的之一)
  2. 从DocumentDB中检索1个文档很快。 Retrive倍数,很长..很长
  3. 没有办法在DocumentDB中以日期时间格式存储日期(我们正在使用“Epoch”黑客攻击:使用自定义JsonDesirializer存储unix时间戳)
  4. 无法更新documentDB中的文档(您需要使用“替换文档”)
  5. LinQ for DocumentDB有很多限制
  6. 根据您的需要,我将使用Azure SQL的高层(p1-p2)。如果它是在内部,绝对是SQL。只需调整索引并确保使用SSD,数据就会流动。 (经验法则:如果可能,你需要尽可能多的RAM作为最大的数据库)

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