【问题标题】:Cloud Firestore better structure for the caseCloud Firestore 结构更好的案例
【发布时间】:2020-06-20 12:40:32
【问题描述】:

我正在开发一个应用程序,用户 (firebase auth) 将在其中注册他们的费用,并在每个星期天通知 (OneSignal) 将在一周内到期的费用。 我的 Firestore 结构是:

-users (collection)
---xxXXxxX (user document)
-----email
-----OneSignal ID
-----expenses (collection)
-------yyYYYyY (expense document)
---------dueDate
---------value
---------userId
-------aaAAaaA (expense document)
---------dueDate
---------value
---------userId
---bBBbbBB (another user document)
-----email
-----OneSignal ID
-----expenses (collection)
-------wwWWwwW (expense document)
---------dueDate
(...)

基于这种结构,每个星期日 Google Cloud 都会运行一个计划函数,该函数将查询当周到期的所有费用(集合组查询 - 返回每个用户可能有多个费用的费用列表。)

有了这个仍然有效的列表,我将手动将 userId 与费用分开,创建第二个列表,每个用户有一个寄存器。使用第二个列表,该函数将获取每个用户的 OneSignal ID(firebase 上的另一个查询,列表中每个用户一个)并在 OneSignal 服务中为每个用户注册一个通知。

P.S:OneSignal ID 可以更改,因为这种情况我无法自费保存 OneSignalID。

我猜这个结构会起作用,但似乎这不是最好的解决方案,因为许多查询在“后台”上运行,这在未来可能会很昂贵。

对于这种情况,有人有更好的建议吗?也许火库上的另一个结构......

我希望我能很好地解释“问题”。英语不是我的第一语言。

谢谢!

【问题讨论】:

    标签: database firebase data-structures google-cloud-firestore nosql


    【解决方案1】:

    根据我在文档中阅读的内容,您做得很完美,这就是原因(任何人,如果我错了,请纠正我)

    1. 当用户下载超过 Xgb 的数据时,Firebase 会向您收费。据我所知,您不会为查询和过滤付费。所以你在这方面做得很好。

    2. Firebase Firestore 查询时间完全取决于您获得的结果数量。结构无所谓。因此,如果您对这种结构感到满意,请坚持下去。我觉得一点问题都没有。

    编辑:我刚刚重新阅读了文档并发现了这一点:

    当您使用 Cloud Firestore 时,您需要支付以下费用:

    • 您执行的读取、写入和删除的次数。
    • 数据库使用的存储量,包括元数据和索引的开销。
    • 您使用的网络带宽量。

    因此,您显然会在查询时被收费。在这种情况下,构建数据库的更好方法可能是展平费用树。你可以有这样的东西

    Users - - - -
                 |------
                 |------
    
    Expenses - - - - -
                         user ID - - -
                          Etc---------
                          Etc----------
    

    这样您就可以过滤用户的查询。 https://cloud.google.com/firestore/docs/query-data/queries#:~:text=Cloud%20Firestore%20provides%20powerful%20query,Data%20and%20Get%20Realtime%20Updates.

    【讨论】:

    • 实际上,firebase 对读取、编辑、删除和存储数据的次数收费。 [firebase.google.com/docs/firestore/pricing#us]。这就是为什么我想避免搜索所有用户费用以仅发送一个通知的原因之一。但我看不出如何......
    • 我刚刚更新了我的答案。我的意思是你可以再做一个收藏来支付费用?并将用户 ID 写为文档或 ID 本身。这将为您节省一些阅读量
    • 谢谢@Agustin。我理解您的建议,但我不明白该解决方案将如何节省一些阅读量,因为在我看来,我仍然需要在一周内按用户阅读所有费用(如果有的话,为用户返还许多费用)和之后根据用户集合获取每个用户的 OnSignal ID,对吧?
    • 只是为了补充,收集组[firebase.googleblog.com/2019/06/…我也可以按用户过滤所有费用。我认为这与您提到的结果基本相同,对吧?
    • 是的 :) 我认为您可以节省一些阅读量,使其更平坦,但说实话并不多。我没有看到任何更大的改进,对不起!您只需要等到 Firestore 专业人士给您提示。
    猜你喜欢
    • 2019-09-18
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多