我正在构建一个数据可视化,显示美国、城市、州和县的COVID信息。
真相的最终来源是“纽约时报”在“回购:https://github.com/nytimes/covid-19-data”中发表的三个CSV。
CSV每天更新一次,使用前一天的新数据。
前端包括选择州、县和统计类型(死亡人数、病例数等)。然后显示三条线图,显示随时间变化的速度--在国家、州和县一级。
现在,该应用程序纯粹是前端。它下载三个CSV的集合(相当大),然后对数据进行一系列计算,当承诺完成后,可视化最终显示在浏览器中。一个良好的互联网连接需要5-10秒才能完成--这在生产上很难持续,而且还要求用户下载全部数据,即使他们可能只是在寻找几个州/县的组合。
有没有一种解决方案可以加快速度,而不需要后端呢?还是需要一个正式的数据库/后端结构?
以下是我对后端解决方案(我将使用Node.js / Express REST设置)的总体想法,但希望得到一些建议:
杂项关切:
显然,最好采用无后端解决方案,但我想不出一种方法,在不首先下载完整的CSV的情况下,只使用用户提供的信息来查询这些CSV。
从数据库的角度来看,删除所有数据并完全重写它是一个很大的提升/成本?或者仅仅添加新数据会更符合成本效益(假设这是一种基于云的解决方案)吗?(假设旧数据不变,这是一种假设)
c.我一直把GraphQL作为休息的替代方案,但我不确定它是否能解决下载整个CSV并将它们“存储”到某个地方的问题。已经有几个在线开放源码API提供了一种更方便的查询数据的方法:
https://github.com/Li357/covid-nyt-api https://github.com/desholmes/covid-19-us-api
但这些似乎都是从CSV撤出,他们需要很长的时间。这是因为他们从CSV访问数据而不是数据库,我假设数据库访问速度要快得多吗?
发布于 2020-08-10 05:22:51
为了允许对此类数据进行各种查询,这些查询仅通过网络传输所请求的比特和字节数量,为此需要对数据进行预处理和优化,这是无法避免的。这正是创建数据库的目的。试图通过“避免数据库”来使事情变得更简单,最终会建立一个独立的数据库,所以重新发明轮子。
是否有一种解决方案可以在不需要后端的情况下加快速度?
理论上,我们可以建立一个对等解决方案,其中数据库构建在一个客户端上,并在其他客户端上重用,但这肯定不是简单的,也可能不是您想要的。所以最好选择最简单、最直接的解决方案,即使用数据库后端。如果您有速度问题,请使用具有内存中功能的数据库,如SQLite。
但是,如果您没有后端,也没有预处理数据,只有"GitHub“作为”穷人的后端“,那么就没有办法首先将所有的CSV数据拖到浏览器上。正如你所写的,这并不能给你一个令人满意的体验。
从数据库的角度来看,删除所有数据并完全重写它是一个很大的提升/成本吗?或者仅仅添加新数据会更符合成本效益(假设这是一种基于云的解决方案)吗?
这最终取决于新旧数据的数量,以及数据的比率,但不要忘记,数据每天只更新一次,而且可能有大量的时间对其进行预处理(=将其存储在数据库中)。所以,选择你能想到的最简单的解决方案,然后当你注意到它变得太慢时,再对它进行优化。别想太多了。
我一直在看GraphQL
GraphQL是查询数据的更丰富的方法。它并没有改变以前的任何考虑。
发布于 2020-08-10 05:44:58
即使是完整的县级CSV数据也相对较小(16 MByte),因此可以在没有数据库的情况下将其完全缓存在后端内存中,并在内存中保持状态和县的简单索引。数据可以保存为原始CSV文件行的副本,因此后端可以以前端当前准备处理的格式交付它。
内存中的数据可以由CSV文件的本地文件系统副本支持,以避免重复查询源,并且可以通过某些预定的下载过程刷新,该过程使用If-修改--因为HTTP报头只能在新数据可用时才下载。这可能已经在一些缓存库中可用了。
后端可以提供非常小的API:
要获得县的列表并使用查询参数访问数据,前端将需要最少的更改。所有数据处理都可以不修改。
发布于 2020-08-10 20:44:51
因为真相的来源是git,所以如果您只需将数据库复制到您的web服务器上,就可以放弃使用数据库。然后,让您的后端只需阅读本地副本,而不是每次请求它从Github。这也使得保持数据同步变得更容易,因为您只需要偶尔做一次执行git pull
的cron任务。
如果您不想/不能在您的web服务器上安装git,您可以使用类似于git-ftp的东西来保持它的同步。
注意:我没有使用git-ftp,这只是我在快速搜索中发现的第一件事。也许有更好的方法可以做到这一点。
一个更困难的解决方案是在github上创建您自己的git,下载csv文件,将它按县划分,然后用data-by-county/us-counties-Alabama-Autauga.csv
这样的名称上传到您的回购中。然后,前端代码可以只检索用户感兴趣的县的数据。不需要后端。只需确保每天运行一次流程或其他什么。
https://softwareengineering.stackexchange.com/questions/414652
复制相似问题