我正在编写一个微小的网站来显示赞助的内容的统计信息,当我注意到我经常将一个小型工具作为一个网站来显示一个小型的统计数据,以便从数据库查询一些数据,然后在图表中显示它,表格,或类似。但是,如果要使用数据库,则需要编写后端(然后需要托管并永久维持)或将整个数据集下载到浏览器中(当数据集超过10MB时不太大)。
在过去,当我在某些时候使用了这些小侧面项目的后端服务器时,一些外部API会下降或钥匙到期或者我忘记了后端并停止支付它所在的任何VPS。然后,当我多年来重新审视它后,我很生气,它已经消失了,诅咒自己依赖外部服务 - 或者在更长的时间内关心我的关心。
托管静态网站比A&#34更容易;真实的"服务器 - 有许多免费且可靠的选项(如Github,Gitlab页面,NetWify等),并且它基本上无限制地没有任何努力。
所以我写了一个能够在静态托管网站中使用真实的SQL数据库的工具!
以下是使用世界开发指标数据集的演示 - 具有6个表的数据集,超过800万行(总计670分)。
如您所见,我们可以查询WDI_Country表,同时仅获取1KB数据!
这是一个完整的SQLite查询引擎。因此,我们可以使用例如。 SQLite JSON功能:
我们还可以注册js函数,以便可以从查询中调用它们。这是一个具有GetFlag函数的示例,它可以为国家/地区获取标志Emoji:
那么如何在静态文件蜂窝织上使用数据库?首先,SQLite(用C)编译为WebasseMbly。可以在没有任何修改的情况下使用EMScripten编译SQLite,并且SQL.js库是WASM代码周围的薄JS包装器。
SQL.js允许您从完全处于内存的数据库中创建和读取 - 所以我实现了一个虚拟文件系统,当SQLite尝试从文件系统中读取时,使用HTTP范围请求获取数据库的块:SQL.js-httpvfs 。从SQLite的角度来看,它看起来像是在一个普通的计算机上,除了一个名为/wdi.sqlite3的文件,它可以读取的文件。当然它不能写入这个文件,但只读数据库仍然非常有用。
由于通过HTTP获取数据非常大的开销,因此我们需要在块中获取数据,并在请求数量和使用的带宽之间找到一些平衡。值得庆幸的是,SQLite已经组织了它的数据库"页面"具有用户定义的页面大小(默认为4个Kib)。我将页面大小设置为此数据库的1个Kib。
运行上述查询并查看页面读取日志。 SQLite为该查询读取了7页读取。
三页读数只是一些架构信息(这些已经缓存)
两个页面读取位于WDI_Series表数据上(第一个通过主键找到行值,第二个以从溢出页面获取文本数据)
一个更复杂的查询:基于2010年后的最新数据的青年识字率最低的国家是什么?
上面的查询应该执行10-20 GET请求,从而取得了总共130-270kib,取决于您是否运行上述演示。请注意,它只必须执行20个请求,而不是270(通常会在捕获270个Kib时使用1个Kib)。这是因为我实现了一种预取系统,其尝试通过三个单独的虚拟读取头来检测访问模式,并且指数地增加了顺序读取的请求大小。这意味着索引扫描或表扫描读数超过几个Kib的数据只会导致扫描的总字节长度中的数量是对数的请求。您可以通过查看"访问模式"页面中的列读取上面的日志。
当我们在与查询匹配的数据库中具有索引时,所有这些都仅适用于符合查询的指标。例如,上述查询中使用的索引是WDI_DATA(Indegator_code,Country_code,年,值)的索引。如果该索引不包括值列,则SQLite引擎必须执行另一个随机访问(不可预测的)读取,因此HTTP请求检索每个数据点的实际值。如果索引已订购Country_code,则指示符,...,那么我们将能够快速获取单个国家的所有指标,但并非所有指标的所有国家/地区值。
我们还可以使用SQLite FTS模块,因此我们可以在数据库中的更多文本重型信息进行全文搜索 - 在这种情况下,数据库中有超过1000个人的开发指标,具有更长的描述。
指标_Search FTS表中的数据总量约为8 MB。上面的查询应该只取出大约70个Kib。您可以看到它在此处的构建方式。
最后,这是一个更完整的展示该系统的有用性 - 这是一个交互式图表,显示了您想要的任何国家随着时间的推移,您想要的任何国家/地区都使用DataSet的任何指标:
国家:指标:互联网用户是过去3个月内使用互联网(来自任何地点)的个人。互联网可以通过计算机,手机,个人数字助理,游戏机,数字电视等使用。
互联网是全球公共计算机网络。它提供了访问许多通信服务,包括万维网,提供电子邮件,新闻,娱乐和数据文件,而不管使用的设备(未被假定只能通过计算机 - 它也可以通过手机,PDA,游戏机,数字电视等)。访问可以通过固定或移动网络。有关源和国家备注的其他/最新信息,请参阅:https://www.itu.int/en/itu-d/statistics/pages/stat/default.aspx
数字和信息革命改变了世界学习,沟通,做生意和治疗疾病的方式。新的信息和通信技术(ICT)为所有国家的各界人士提供了巨大的进步 - 经济增长机会,改善健康,更好的服务交付,通过远程教育学习,以及社会和文化的进步.Tay' s智能手机和平板电脑具有相当于昨天' S计算机的计算机功率,并提供类似的功能范围。因此,设备融合是呈现出对ICT的访问,使用,质量和可负责性的传统定义,以适应扇区的增长能力和监测和评估该部门对开发的影响。虽然许多国家的基本访问数据可用,但在大多数发展中国家中,众所周知,谁利用ICT;他们用于(学校,工作,商业,研究,政府)的用途;他们如何影响人和企业。全球关于衡量ICT发展的伙伴关系正在帮助设定标准,协调信息和通信技术统计,并在发展中国家建立统计数据。然而,尽管发展中国家有重大改善,但ICT留在ICT和仍然存在的差距。
请注意,许多指标仅适用于某些国家/地区,例如指标"相信丈夫在烧毁食物时遭到妻子的妇女是合理的。基于在下发达国家进行的调查。
由于我们已经在浏览器中运行了一个数据库,因此为什么不使用名为DOM的虚拟表将我们的浏览器用作数据库?
当然,这里的一切都是开源。 SQLite包装器的主要实现在SQL.js-httpvfs中。此博客文章的源代码是Pandoc标记文件,演示是自定义"围栏代码块"反应组分。