【问题标题】:Is it ok to add timestamp as a document field in firestore database?可以在firestore数据库中添加时间戳作为文档字段吗?
【发布时间】:2019-12-10 22:52:54
【问题描述】:

在使用Cloud Firestore 时,我在Add data to Cloud Firestore Docs 上阅读了此声明:

重要提示:与 Firebase 实时数据库中的“推送 ID”不同,Cloud Firestore 自动生成的 ID 不提供任何自动排序。如果您希望能够按创建日期对文档进行排序,则应将时间戳作为字段存储在文档中。

所以,我设计了我的数据库,因为它在所有文档中都包含timestamp 字段。

但在那之后,我在Best Practices Docs 上阅读了这些声明:

请注意,索引具有单调递增值的字段, 例如时间戳,可能会导致影响延迟的热点 具有高读写率的应用程序。

避免按字典顺序关闭文档的高读写率,否则您的应用程序将遇到争用错误。这个问题是 称为热点,您的应用程序可能会遇到热点 如果它执行以下任何一项:

  • 以非常高的速率创建具有单调递增字段(如时间戳)的新文档。

所以我现在很困惑。我正在开发一个安卓应用程序。我可以使用timestamp 作为字段吗?如果我的应用程序有很多用户,它会产生任何问题吗?是的,我必须按创建日期订购文件。

【问题讨论】:

    标签: android firebase google-cloud-firestore


    【解决方案1】:

    这两个文档之间存在巨大差异。

    第一个是指 Cloud Firestore 自动生成的 ID 不像 Firebase 实时数据库推送 ID 那样具有时间组件。这就是它无法提供任何自动排序的原因。因此,它与您将时间戳作为对象的属性这一事实无关。

    第二个是指不建议使用单调递增的值,例如时间戳作为文档的ID。所以请记住,只有在数据库中使用此类时间戳作为键时才会出现这种情况,只有在这种情况下才会导致影响延迟的热点。

    由于您在每个文档中都使用时间戳作为字段,因此无需担心。如果您将该时间戳用作 Coud Firestore 中的文档 ID 或 Firebase 实时数据库中的节点键,则适用上述规则。

    【讨论】:

    • 非常感谢您的澄清。我只是对第二条声明中的monotonically increasing field 这一行感到困惑。
    • monotonically increasing field 表示如果您选择文档的 ID,例如 001、002、003 等。此类名称可能会导致影响延迟且无法帮助您扩展的热点。
    • @Alex Mamo,我认为文档 ID 没有参考。在 Best Practices for Cloud Firestore 的索引部分下,它显示 Be aware that indexing fields 而不是文档 ID。此外,后者在页面顶部有自己的部分。作为参考,我在 r/firebase 上发布了一个关于问题 link 的问题
    • 答案实际上在索引豁免部分。如果您在该集合中每秒写入超过 500 个文档,则几乎应该为时间戳添加一个豁免。 reference
    猜你喜欢
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 2020-02-11
    • 2019-04-30
    • 1970-01-01
    • 2021-01-22
    • 2018-10-24
    • 2020-11-24
    相关资源
    最近更新 更多