Firestore:ID 在集合中是唯一的还是全局唯一的?
Posted
技术标签:
【中文标题】Firestore:ID 在集合中是唯一的还是全局唯一的?【英文标题】:Firestore: Are ids unique in the collection or globally? 【发布时间】:2018-03-19 00:37:55 【问题描述】:对于我的数据库的结构,我需要知道 Firebase Cloud Firestore 中自动生成的标识符在集合中还是在整个数据库中是唯一的。
怎么做?
【问题讨论】:
【参考方案1】:在 Firestore 中调用 add()
生成的密钥与调用 add()
的集合无关。相反,它们是随机标识符,在统计上保证是唯一的。对于 Firestore(和 Firebase 实时数据库),这些密钥是在客户端生成的。
如果您有兴趣,可以看看 Firestore javascript SDK 是如何实现逻辑的:
add
calls doc()
doc
calls AutoId.newId()
AutoId.newId()
generates a client-side ID
其逻辑本身类似于 Firebase 实时数据库生成其推送 ID 的方式。主要区别似乎是 Firestore 的自动生成的密钥不是基于本地时间戳,因此它们不能有意义地用于对集合中的文档进行排序。
【讨论】:
有没有更好的方法来使用.collection()
和.doc()
来访问数据,而不必为每个文档/集合创建自定义ID?我的意思是,如果我让 Firestore 做自动 id,除非我使用自己的命名约定,否则我没有实际的方法来提取我需要的记录...
阅读 newId() 代码后,我对 id 的唯一性产生了一些疑问。它似乎从 20 个随机挑选的字符中创建了一个字符串。如何保证这是独一无二的?
好的,有 63^20 个可能的 id。非常不可能,但并非不可能,对吗?
正确,这是极不可能的,但不能保证。与 UUID 和 GUID(2^122 组合)相同。
@FrankvanPuffelen 我发现 SDK 依赖于 Math.random
非常有趣,这只是伪随机的。这是否意味着在实践中,在客户端(通常)生成随机 ID 就足够了,即使它们不是完全随机的。我在想,如果它可以在 Firebase 规模上运行,那么它对于我自己的应用程序来说必须足够好。我想知道 Firebase 团队是否也测试了加密安全随机数生成,并认为它太慢或不值得。【参考方案2】:
似乎在节点和现代浏览器中,自动生成的 ID 是加密质量随机的。 https://github.com/firebase/firebase-js-sdk/blob/66deb252d9aebf318d2410d2dee47f19ad0968da/packages/firestore/src/platform/node/random_bytes.ts
【讨论】:
以上是关于Firestore:ID 在集合中是唯一的还是全局唯一的?的主要内容,如果未能解决你的问题,请参考以下文章
Firestore - 如何在将文档添加到集合后获取文档 ID
Swift - Cloud Firestore 中的唯一 ID