当前位置: 首页 > 知识库问答 >
问题:

在FireStore中构造这类数据的正确方法是什么?

韦德厚
2023-03-14

我有这个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

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

共有1个答案

司寇灵均
2023-03-14

在FireStore中构造这类数据的正确方法是什么?

您需要知道,对于构建云Firestore数据库,没有“完美”、“最佳”或“正确”的解决方案。最好和正确的解决方案是适合你的需要和使你的工作更容易的解决方案。还要记住,在NoSQL数据库的世界中也没有单一的“正确的数据结构”。所有数据都被建模为允许应用程序所需的用例。这意味着,对一个应用程序有效的东西,对另一个应用程序可能不够。所以不是每个人都有一个正确的解决方案。NoSQL类型数据库的有效结构完全取决于您打算如何查询它。

你构造数据的方式对我来说很好。一般来说,有两种方法可以实现相同的目标。第一种方法是在product对象中保留提供者的引用(就像您已经做的那样),或者在product文档中复制整个提供者对象。最后一种技术称为反ormalization,在涉及到Firebase时是一种非常常见的做法。因此,我们经常在NoSQL数据库中复制数据,以适应否则可能无法进行的查询。为了更好地理解,我建议您看看这个视频,反正规化在Firebase数据库中是正常的。它适用于Firebase实时数据库,但同样的原则也适用于云FireStore。

你现在可能想知道,哪种技术最好。一般说来,在NoSQL数据库中存储引用或重复数据的最佳方式完全取决于项目的需求。

因此,您应该问自己一些关于您想要复制的数据的问题,或者简单地将其作为引用:

  1. 是静态的还是会随时间变化?
  2. 如果是这样,是否需要更新数据的每个重复实例,以便它们都保持同步?这也是我前面提到的。
  3. 谈到Firestore,您是为了性能还是成本进行优化?

如果您的重复数据需要在同一时间内更改并保持同步,那么您将来可能会很难保持所有这些重复数据都是最新的。这也可能意味着您要花很多钱来保持所有这些文档的新鲜,因为这将要求对每个文档进行每次更改的读写操作。在这种情况下,只保留引用将是获胜的变体。

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

如果您需要查询速度非常快,您可能希望复制更多的数据,以便客户端只需读取每个查询项的一个文档,而不是多个文档。但是您也可以依赖于本地客户机缓存,这会降低成本,这取决于客户机必须读取的数据。

在NoSQL数据库中,这是一个常见的考虑因素:您通常必须考虑写性能和磁盘存储,而不是读性能和可伸缩性。

对于您选择是否复制某些数据,它高度依赖于您的数据及其特性。你必须根据具体情况来考虑。

因此,最后,请记住,这两种方法都是有效的,没有一种方法比另一种方法更好。这完全取决于您的用例是什么,以及您对这种复制数据的新技术有多满意。数据复制是快速读取的关键,不仅仅是在云Firestore或Firebase实时数据库中,而是在一般情况下。任何时候将相同的数据添加到不同的位置,都是在复制数据,以提高读取性能。不幸的是,作为回报,您有一个更复杂的更新和更高的存储/内存使用率。但是您需要注意的是,在Firebase实时数据库中的额外调用并不昂贵,而在Firestore中是昂贵的。相对于额外的数据库调用,多少重复数据对您来说是最佳的,这取决于您的需求和您放弃“单点定义心态”的意愿,这种心态可以被称为非常主观的。

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

还要记住,有些数据库结构更容易用一些安全规则来保护。因此,尝试找到一个可以使用云Firestore安全规则轻松保护的模式

还请看一下我在这篇文章中的回答,我在这里解释了关于FireStore中的集合映射数组的更多信息。

 类似资料:
  • 我很难确定这到底是什么。此时,我已经熟悉了方法、构造函数和类声明的样子。这是哪个?为什么它看起来像一个构造函数和一个方法有一个婴儿?

  • 我试过、以及不同的导入(我想也许我没有使用singletons使用的正确的“NAT”或“Natural”),所有这些都给我带来了类似的错误。这里有什么问题?我必须为的类型编写singletons手动生成的定义吗?还是这里缺少了什么?

  • 问题内容: 在PHP系统中,我有一个常见的MVC情况:从包含的数据中接收请求。现在,我有三种方法来处理数据: a)仅调用和处理数据。 b)在变换的数据转换成变量,并将它们传递到。 c)将数据转换为的域对象,并将该对象仅传递给。 目前,我正在使用选项A,但是我认为这是错误的,因此我正在考虑使用选项C。 因此,根据MVC,处理数据的正确方法是什么? 编辑 目前,我没有使用任何MVC框架。 编辑2 通常

  • 问题内容: 这些来自github上的spring amqp示例,位于https://github.com/SpringSource/spring-amqp- samples.git 这些是 什么类型的Java构造函数?它们是吸气剂和吸气剂的捷径吗? 与此相反 问题答案: 这些构造函数被重载以使用调用另一个构造函数。第一个无参数构造函数使用空参数调用第二个。第二呼叫的第三构造(未示出),其必须采取,

  • 我有以下练习: 添加代码以使其正常运行。 我加了一个私人财产 和一个公共构造师 我添加了int-val,作为构造函数为MyVal分配一个非临时对象地址的一种方式,比如x。 有没有一个简洁(呃)的方法来回答这个练习?

  • 我正在通过使用Laravel作为后端开发来创建一个电子商务移动应用程序。 方案:我有一个Product表,其中存储了有关产品的一些信息。每当用户购买一个产品,他将得到一个购买历史记录(它将显示产品信息)将被存储到数据库中。所以当卖家更新他们的产品信息时,用户购买历史记录的产品信息不会受到影响。 问题:如果我只是简单地创建一个用户的购买历史记录表来存储每个用户的记录,我认为这将在数据库中需要大量的空