【问题标题】:Efficient NoSQL data model for large collections用于大型集合的高效 NoSQL 数据模型
【发布时间】:2019-07-22 16:08:35
【问题描述】:

场景:

一个元素中有 1,000,000 个坐标(像素)。

一个坐标由x: number, y: number组成

用户选择一个坐标来“激活”

对用户的目标:

显示激活的唯一坐标的计数。

即1,000,000 个坐标中的 247,456 个已激活

数据库目标:

如此庞大的数据集应该如何在 NoSQL 中建模?

方法#1 使用可能的坐标预填充集合并在激活坐标时删除它们/增加一个计数器

在列表中搜索会很昂贵,但只会随着更多坐标被激活而改善。

方法 #2 随着坐标的激活和增加,文档的集合越来越多。

如果没有高效的架构,读/写会变得越来越昂贵。

【问题讨论】:

  • 如果我理解这个问题,您实际上是在问如何计算一个节点激活的子节点的数量。如果这是正确的,一个简单的计数器就可以了;当一个节点被激活时,增加计数器。停用时,递减计数器。如果不知道将运行什么样的查询或将如何处理数据,我们就无法建议模型。您的问题中建议的结构可能有效,也可能无效。这是多用户吗?什么时候完成读写?有多少用户?多常?可以使用交易吗?看?变量太多了。
  • 我不需要重新计算已激活的节点。任何人都可以来激活节点,一旦激活,我想增加一个计数器来跟踪激活的节点总数。不需要事务,将其视为单击一次的像素,如果该节点尚未激活,则激活并增加计数器
  • 那么,我想你有你的解决方案!柜台+1! (笑)

标签: angular database firebase nosql data-modeling


【解决方案1】:

使用第二种方法,只需花时间围绕它构建一个好的架构,因为这将非常有用,并进一步降低文档的读取成本以删除第一种方法中的坐标

【讨论】:

  • 您能否介绍一下什么是好的架构?例如,最好创建批次坐标的子集合。 IE。将 x
  • @Flignats 否。不要使用选项 2... 或 1。如果有可能会有 1,000,000 个子节点,那么获得您需要的计数也不是一个好的解决方案遍历所有需要花费大量时间的子节点,或者将它们全部加载并计算它们(例如,在数组中),但这会使设备的内存过载。
  • 是的,但我只使用方法#2 来进行对话。跟踪 1,000,000 个激活坐标的有效方法是什么?方法#1的混合体?
  • @Flignats 我认为您提供了自己的答案,如您对问题的评论中所述。在节点中保留一个计数器,并在坐标节点被激活时递增,在坐标节点被停用时递减 - 这是一种简单的低带宽解决方案,不需要任何类型的计数或重新计数。
  • 该解决方案仍然没有概述了解这些节点是如何被激活的方法。 IE。我将不得不搜索具有激活布尔值的节点列表以了解其状态以了解递增计数器。如果用户选择节点 105、450 - 我需要知道它是否先前被激活以增加计数器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-21
  • 2020-03-02
  • 1970-01-01
相关资源
最近更新 更多