Azure DocumentDB-存储遥测数据

Azure DocumentDB-存储遥测数据,azure,azure-cosmosdb,document-database,telemetry,nosql,Azure,Azure Cosmosdb,Document Database,Telemetry,Nosql,下面是我为什么提出这个问题的最新情况 我们目前正在Azure SQL Server中存储现场设备的遥测数据。这非常有效(在EF、LINQ和relationship dbs方面有丰富的经验),但我知道这很可能不是存储“大”数据的最佳解决方案(数据目前仍然很小,但将在一年内增长) 我选择DocumentDB作为我们存储事件历史的可能解决方案。剩下的将留在SQL中-用户、配置文件、设备信息、sim卡、车辆等,因为我不想完全停止开发,因为我们将100%转移到docdb,而只是做最好的短期-成本+性能 通

下面是我为什么提出这个问题的最新情况

我们目前正在Azure SQL Server中存储现场设备的遥测数据。这非常有效(在EF、LINQ和relationship dbs方面有丰富的经验),但我知道这很可能不是存储“大”数据的最佳解决方案(数据目前仍然很小,但将在一年内增长)

我选择DocumentDB作为我们存储事件历史的可能解决方案。剩下的将留在SQL中-用户、配置文件、设备信息、sim卡、车辆等,因为我不想完全停止开发,因为我们将100%转移到docdb,而只是做最好的短期-成本+性能

通过这段视频,我终于想出了一个可能的解决方案,即如何存储遥测数据- 他们建议每个时间段使用一份文档(例如每小时使用一份文档)。这仍然是推荐的方法吗


这是几种可能的选择之一。哪一个最好取决于数据的外观。例如,如果您的事件的开始日期/时间和持续时间(或结束日期/时间)不同,或者如果您跟踪实体的所有状态更改,则类似于“时态数据模型”的内容是理想的。有趣的是,Microsoft SQL Server 2016最近添加了对的直接支持,但它们作为TSQL2在SQL规范中已经存在了一段时间。注意,TSQL2规范包括和支持,但我相信最近添加的MS SQL 2016只支持有效时间。。。但这没关系,因为这才是最有价值的。我只是指出这一点,因为如果不增加事务时间的复杂性,了解有效时间表的工作原理就足够困难了

这种方法的美妙之处在于,您不必在收集数据时决定所需的时间粒度,只有在聚合数据时

但是,正如您所说,SQL对于如此大的数据集并不理想。因此,我在我的库中的DocumentDB之上实现了有效的时间Richard Snodgrass样式的时态模型,特别是和它的其他时间序列功能。阅读第10-19页,了解Lumenize时间序列分析中数据模型和常见操作的背景资料。这是我在Rally时做的一个实现,叫做构建在MongoDB上的LookbackAPI,但概念是一样的,我现在已经切换到DocumentDB(但Rally没有)

另一个关于你提出的模型的评论,你可能需要考虑一个单独的文档。如果每分钟有一个文档,或者每台设备有一个文档,那么这个示例会让人有点困惑。如果是每台设备每小时一个,那么您可以放心,您将永远不会超过60分钟,这也没关系,但在我能想到的几乎所有其他方式中,看起来您有一个文档无限增长的风险,这在DocumentDB(以及所有NoSQL数据建模)中是一个大禁忌。此外,正如您所说,即使它不是无界的,也会涉及大量的就地更新。由于您的系统可能写得很重,我建议您最好每次阅读一个文档。如果以后必须存储非规范化聚合以提高速度,那么您仍然可以选择这样做。你甚至可能不需要它。让生产系统的性能作为决定的依据

我建议您仔细阅读星型模式的时间维度。它看起来与您计划的非常相似,但它也是我描述的非规范化聚合存储的理想选择。我还没有看到任何针对NoSQL的星型模式概念的编写,但它来自传统SQL世界,可以帮助您理解这些概念


正如我所说,有很多替代方案,如果不了解您的情况,我就不知道哪一个是最好的。

好的,所以我想我会选择每个事件1个文档(现在每5分钟1个,但可以更改为每个设备每秒1个)。原因是附加到文档中肯定会很昂贵,因为您需要对该文档进行“替换”??(docdb现在支持追加/部分更新吗?)当然,这涉及到读取,然后是不断增加的替换,这比仅为每个事件添加一个新文档更昂贵、更及时。唯一令人担心的是当我们有数百万/数十亿的文件。。。好吗?

谢谢你的回答!我将尽快更彻底地了解它,同时我将解释数据速率、数据的外观以及如何使用。现在我们可以放心地说,每5-10分钟一包,所以非常少。。。现在!可以肯定地说,我应该设计为每秒1次,但从设备中获取数据需要30-60秒(有点不相关)。我在我的原始帖子中添加了一些代码优先的数据模型。大多数内容都是空的,因为只有某些消息填充了某些字段,我不知道这是否也会产生影响…可以通过省略字段来指示
null
。在查询时必须小心一点,因为实际的null值和缺少的值将以不同的方式响应。使用
已定义(…)
而不是
为空(…)
。这种方法在存储方面有优势,但它也使索引更小更快。非常感谢,所以我认为我的两个选项是:每个事件1个文档(可以是每秒:/)或每个时间段1个文档(每小时1个)。数据是完全不同的-lat、long、time、#sats、HDOP等。每台设备每秒创建一个文档的缺点是什么?成本/性能?如果是这样的话,我会在每个时间段(一小时或一天)为每个设备制作一个文档。请再次告诉我。。。在正确阅读了Azure临时表之后,我现在又对SQL感到兴奋了,哈哈,也许有一天我会看看如何处理一个庞大的表(index/scale god;)。这将非常有效,我相信监控变化(门状态、点火等)非常有效!我想我需要回答的是-SQL真的对我的设计设置那么糟糕吗?这是第四次吗
    [Index]
    public DateTime TimestampUtc { get; set; }
    public DateTime ReceivedTimestampUtc { get; set; }
    [Index]
    public EventType EventType { get; set; }
    public Guid ConnectionId { get; set; }
    public string RawEventMessage { get; set; }
    [Index]
    public Sender Sender { get; set; }
    [Index]
    public Channel Channel { get; set; }
    public DbGeography Location { get; set; }
    public double? Speed { get; set; }
    public double? Altitude { get; set; }
    public Int16? Heading { get; set; }
    public Byte? HDOP { get; set; }
    public Byte? GPSFixStatus { get; set; }
    public Byte? GPSFixType { get; set; }
    public string Serial { get; set; }
    public string HardwareVersion { get; set; }
    public string FirmwareVersion { get; set; }
    public string Relay1 { get; set; }
    public string Relay2 { get; set; }
    public string Relay3 { get; set; }
    public string Ign { get; set; }
    public string Doors { get; set; }
    public string Input1 { get; set; }
    public string Input2 { get; set; }
    public string Out1 { get; set; }
    public string Out2 { get; set; }
    public int V12 { get; set; }
    public int VBat { get; set; }