【问题标题】:Download all data, filter locally OR Download filtered data only下载所有数据,在本地过滤或仅下载过滤后的数据
【发布时间】:2019-11-01 18:32:01
【问题描述】:

我有一个商店网络应用 React 前端,Firebase 在后面,Firestore 作为 DB。

我的商店有 500 件商品。我期待只有桌面客户端。

最好的做法是:

  • 在初始加载时一次将所有项目下载到本地对象数组中,并使用.filter()进行过滤;
  • 在客户端过滤时调用数据库以仅返回过滤后的数据。

为了一次性下载,我在想:

  1. 每个过滤器(也许)更快,因为它是在本地完成的。我不确定对象数组的过滤速度比从服务器获取响应的速度要慢。由于客户端只会是桌面,所以我的想法很大。
  2. 不需要为每个过滤器与服务器通信。 Firestore 还会计算读取、写入或事务次数的配额,因此它应该会减少我的配额使用量。
  3. 在同一个客户端上重复相同的过滤器不需要再次请求相同的数据。就像客户端可能会过滤,然后重置过滤器,然后再次执行相同的过滤器。

仅下载过滤后的结果,我在想:

  1. 在服务器上过滤并回复(可能)比本地.filter() 更快。
  2. 客户总能获得最新信息。
  3. 更快的初始加载。

我知道这可能取决于数据库结构,因为 Firestore 是浅查询,所以我将数据结构化为尽可能浅,文档中没有子集合。

我只是比较普通的东西,所以后面没有 Algolia 或 Elastic,前面没有搜索或索引库。

【问题讨论】:

    标签: javascript database firebase google-cloud-firestore


    【解决方案1】:

    500 是极少数的文档。现代桌面系统对列表进行排序和过滤绝对没有问题。您可能对 Cloud Firestore 的账单让您始终对所有查询进行排序和过滤,而不是只下载一次并在本地完成所有操作的性能更令人不安。不过,这取决于您对应用用户的期望行为(以及文档的大小,以及他们的连接速度)。

    当您达到 50,000 个项目(在低端台式机上)时,您可能会发现一些性能问题,但可能不足以给任何人带来不便。尝试编写几行代码来排序或过滤 50,000 个随机整数,看看需要多长时间。您的实际应用程序代码与真实数据的表现应该没有太大差异。

    如果您能够在本地缓存文档而无需再次查询它们,您会做得更好。考虑为上次更新添加一个文档字段,并仅查询自上次查询以来更新的文档。您将节省更多的金钱和时间。

    最后,您应该对用例进行基准测试,以获取一些实用数据。花更少的时间推测和更多的时间测量。

    【讨论】:

    • 但是,在 50,000 个项目中,我认为初始下载比过滤(就时间而言)更成问题。我将尝试模拟本地过滤器的时间,但是对于从 Firestore 获取 50,000 个项目的时间的真实模拟是什么?
    • 生成与每个文档的预期大小近似的随机数据。然后进行基准测试。
    猜你喜欢
    • 2017-05-26
    • 2021-12-13
    • 2021-11-20
    • 1970-01-01
    • 2020-11-26
    • 2016-08-18
    • 2023-03-18
    • 2021-08-21
    • 1970-01-01
    相关资源
    最近更新 更多