热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java–在Firestore中构造此类数据的正确方法是什么?

我从GoogleFirebase服务中看过视频并阅读了Cloudfirestore的文档,但我无法想象实时数据库.我想到了这个Web应用程序,我希望从不同类别的产品中存储我的提供程

我从Google Firebase服务中看过视频并阅读了Cloud firestore的文档,但我无法想象实时数据库.

我想到了这个Web应用程序,我希望从不同类别的产品中存储我的提供程序.我希望通过我的所有产品执行搜索查询,以查找我对此类产品的提供商,并最终访问该提供商信息.

我打算为此目的使用这个结构:

Providers ( Collection )
Provider 1 ( Document )
Name
City
Categories
Provider 2
Name
City
Products ( Collection )
Product 1 ( Document )
Name
Description
Category
Provider ID
Product 2
Name
Description
Category
Provider ID

所以我的问题是,一旦我得到我想要的产品,这种方法是否是访问提供商信息的正确方法?

我知道在实时数据库中这是可能的,使用我可以在提供者部分中搜索该提供者的提供者ID,但是使用Firestore我不确定它是否可行或者这是否正确.

解决方法:


What is the correct way to structure this kind of data in firestore?


您需要知道构建Cloud Firestore数据库没有“完美”,“最佳”或“正确”的解决方案.最佳和正确的解决方案是满足您需求的解决方案,使您的工作更轻松.请记住,NoSQL数据库世界中也没有单一的“正确的数据结构”.所有数据都经过建模,以允许您的应用所需的用例.这意味着适用于一个应用程序的内容可能不足以用于其他应用程序.所以每个人都没有一个正确的解决方案. NoSQL类型数据库的有效结构完全取决于您打算如何查询它.

您构建数据的方式对我来说很好.一般来说,有两种方法可以实现同样的目的.第一个是在产品对象中保留提供者的引用(如您所做)或复制产品文档中的整个提供者对象.最后一个tehnique称为非规范化,对于Firebase来说是一种非常普遍的做法.因此,我们经常在nosql数据库中复制数据,以适应其他情况下可能无法实现的查询.为了更好地理解,我建议您看到此视频,Denormalization is normal with the Firebase Database.它适用于Firebase实时数据库,但同样的原则适用于Cloud Firestore.

此外,当您复制数据时,有一件事需要记住.与添加数据的方式相同,您需要对其进行维护.换句话说,如果要更新/拒绝提供者对象,则需要在其存在的每个位置执行此操作.

你现在可能想知道,哪个tehnique是最好的.从一般意义上讲,在NoSQL数据库中存储引用或重复数据的最佳方法完全取决于项目的要求.

因此,您应该问自己一些关于要复制的数据的问题,或者只是将其作为参考:

>是静态的还是会随着时间而改变?
>如果是,您是否需要更新每个重复的数据实例,以便它们保持同步?这就是我之前也提到过的.
>说到Firestore,你是在优化performance还是cost?

如果您的重复数据需要更改并在同一时间保持同步,那么您将来可能很难将所有重复数据保持最新.这也可能意味着您花费了大量资金保留所有这些文档,因为每次更改都需要对每个文档进行读写.在这种情况下,仅持有参考将是获胜变体.

在这种方法中,您编写的重复数据非常少(几乎只是提供者ID).这意味着您编写此数据的代码将变得非常简单且非常快.但是在读取数据时,您需要从两个集合中加载数据,这意味着需要额外的数据库调用.对于合理数量的文档,这通常不是一个大的性能问题,但肯定需要更多的代码和更多的API调用.

如果您的查询速度非常快,您可能希望复制更多数据,以便客户端只需要查询每个查询的文档,而不是多个文档.但您也可以依赖本地客户端缓存使其更便宜,具体取决于客户端必须读取的数据.

在此方法中,您为每个产品文档复制供应商的所有数据.这意味着编写此数据的代码更加复杂,您肯定会存储更多数据,每个产品文档还有一个提供程序对象.而且您需要弄清楚是否以及如何使每个文档保持最新.但另一方面,阅读产品文档现在可以在一次阅读中为您提供有关提供者文档的所有信息.

这是NoSQL数据库中的一个常见考虑因素:您通常必须考虑写入性能和磁盘存储与读取性能和可伸缩性.

如果您选择是否复制某些数据,则高度依赖于您的数据及其特征.你必须根据具体情况来考虑.

所以最后,请记住两者都是有效的方法,并且它们都没有比另一方更有针对性.这一切都取决于您的用例是什么以及您对这种重复数据的新方法的满意程度.数据复制是快速读取的关键,不仅仅是在Cloud Firestore或Fireabase实时数据库中,而且通常也是如此.每次将相同数据添加到其他位置时,都会复制数据以支持更快的读取性能.不幸的是,作为回报,您有更复杂的更新和更高的存储/内存使用率.但是你需要注意Firebase实时数据库中的额外调用,并不昂贵,在Firestore中.多少数据复制数据与额外的数据库调用最适合您,取决于您的需求以及您是否愿意放弃“单点定义思维模式”,这可以称为非常主观.

完成几个Firebase项目后,我发现如果我复制数据,我的阅读代码会变得非常简单.但当然,编写代码同时变得更加复杂.这两者之间的权衡和您的需求决定了应用程序的最佳解决方案.此外,为了更加精确,您还可以使用现有工具衡量应用中发生的情况并做出相应决定.我知道这不是具体的建议,但这是软性的发展.一切都是关于衡量事物的.

还要记住,某些数据库结构更容易受到某些安全规则的保护.因此,尝试使用Cloud Firestore Security Rules找到一个易于保护的模式.

另请参阅我在post的答案,其中我已经解释了有关Firestore中的集合,地图和数组的更多信息.


推荐阅读
author-avatar
tony2502877947
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有