代码之家  ›  专栏  ›  技术社区  ›  Moblize IT

在firebase实时数据库中管理pushtokens

  •  -1
  • Moblize IT  · 技术社区  · 7 年前

    我们的应用程序按>1M的顺序使用,不需要任何登录等。我们使用FireBase SDK和Ionic为设备获取推送令牌。问题是我们如何有效地存储它们。我们是否应该使用

    const itemsRef = db.list('tokens');
    itemsRef.push({ token:"tokenValue" });
    

    以上内容将在每次设备打开应用程序时不断添加新节点。我担心的是避免再次添加相同的pushtoken。在上面的结构中,对一百万个节点进行查询,以查看是否存在推送令牌可能是一个巨大的性能问题(我认为不确定)。

    处理这件事的建议是什么?我想查询一个pushtoken,如果它存在的话,可能会很贵。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Frank van Puffelen    7 年前

    一般来说,您可以在一个节点下存储很多键。事实上,我不认为 documented limit . 虽然我很确定有一个理论值它会停止工作,但你不太可能在一个真正的应用程序中实现它。它只是存储一些数据,所以没有什么能阻止您在这里存储数百万的值。

    棘手的一点是再次将这些数据从数据库中取出。但是,例如,如果您知道要读取的数据的确切位置,并且您正在读取的数据大小是合理的,那么这个限制又会很高。

    只有当您想读取/查询遇到限制的键列表时,才需要执行此操作。这里的常见建议是,您不应该查询超过几十万个子节点,尽管在过去的几年中,这个数字似乎已经增加了。但是查询(或读取)数百万个节点将成为性能问题。

    我担心的是避免再次添加相同的pushtoken。

    如果希望某个值在数据库中是唯一的(无论您使用的是实时数据库还是云FireStore),则应将该值用作节点的键(或FireStore中文档的ID)。在代码中应该是:

    const itemsRef = db.list('tokens');
    itemsRef.child("tokenvalue").set(true);
    

    根据定义,键在其父节点内是唯一的,因此将推送令牌用作键自动保证每个推送令牌只有一个子节点。