在 firebase 实时数据库中管理 pushtoken

Managing pushtokens in firebase realtime db

我们的应用程序被超过 100 万的人使用,它不需要任何类型的登录等。我们使用带有 ionic 的 firebase sdk 来获取设备的推送令牌。问题是我们如何有效地存储它们。我们应该使用

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

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

处理此问题的建议是什么?我觉得查询 pushtoken(如果存在)可能很昂贵。

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

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

只有当您想要 read/query 键列表时,您 运行 才会受到限制。这里的常见建议是查询的子节点不应超过几十万个,尽管在过去几年中这个数字似乎有所上升。但是查询(或读取)数百万个节点将成为性能问题。

My concern here is avoiding to add same pushToken again.

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

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

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