我想避免在文档餐厅中添加 geoashes,因为文档可能比它应该的大很多倍。
是的,不要这样做,因为文件有限制。因此,在您可以将多少数据放入文档时存在一些限制。根据有关使用和限制的官方文档:
文档的最大大小:1 MiB(1,048,576 字节)
如您所见,单个文档中的数据总量限制为 1 MiB。当我们谈论存储文本时,您可以存储几乎所有内容,但如果您使用复杂的对象,这不是一个选项。
最初的想法是将所有地理哈希都放在餐厅文档的子集合中,但我发现它不可能在文档的子集合中执行查询。
这是一个很好的解决方案。您的数据库结构应如下所示:
Firestore-root
|
--- restaurants (collection)
|
--- restaurantId (document)
|
--- geohashes (collection)
|
--- geohashId (document)
|
--- //details about the location
因此,可以让您获取geohash
特定餐厅的所有对象的查询将非常有效。
第二个想法是将地理哈希提取到交付区域集合中的顶层
不是一个糟糕的解决方案,但您应该创建一个额外的get()
调用,以获取餐厅详细信息,但即使这样做,也不是一个糟糕的调用,Firestore 中的嵌套查询没有问题。无需OR
操作。
编辑:根据您的评论,是的,您是对的,您无法查询数据库以取回餐厅对象,但我们也有解决方法。在这种情况下,您应该考虑通过添加这样的新集合来扩充您的数据结构以允许反向查找:
Firestore-root
|
--- geohashes (collection)
|
--- geohashId (document)
|
--- geohashRestaurants (collection)
|
--- restaurantId
|
--- //restaurant details
如您所见,这种技术被称为denormalization
意味着复制数据。但是您需要知道,对于 Firebase,复制数据没有问题。这是一种很常见的做法,为此,我建议您观看此视频,Firebase 数据库的非规范化是正常的。适用于 Firebase 实时数据库,但同样的原则也适用于 Cloud Firestore。
复制数据时,需要牢记一件事。与添加数据的方式相同,您需要对其进行维护。换句话说,如果你想更新/删除一个项目,你需要在它存在的每个地方都这样做。