在 Go 中存储数据
大多数程序通常都会处理一些需要持久化的数据——从各种用户输入到内部应用程序状态、运行时缓存,再到程序配置。
本文将概述 Go 语言中可用的数据库选项,并根据我们用于区分不同用例中数据库类型的几个标准进行分类。无论您正在开发的项目是桌面应用程序、服务器程序/微服务,还是嵌入式系统/物联网解决方案,您都应该能够找到满足您需求的存储解决方案。
在单个项目中使用多个数据库系统并不罕见,因为每个系统可能适用于不同的用途,例如一个用于日志记录/跟踪,另一个用于用户数据。但是,请记住,这可能会增加维护负担,因为与任何其他类型的依赖项一样,总会存在学习曲线,需要在更新期间跟踪变更,最后但同样重要的是,还存在安全性和许可方面的问题。此外,如果您发现需要在同一位置从两个数据库中获取数据以执行某些操作,则可能需要重新考虑您的架构选择。
数据存储位置
从本地化的角度来看,根据你正在构建的应用程序类型以及应用程序需要存储的数据类型,主要有两种选择。
-
远程(服务器)存储 ——可以是数据库服务器或其他形式的 API 服务器,你的程序可以连接到该服务器。当多个客户端访问公共数据,或者多个服务使用单个数据库服务器时,远程存储非常有用(尽管后者在面向服务的架构中并不被视为反模式,因为它破坏了服务隔离)。
-
本地存储(嵌入式) ——当数据仅供特定应用程序使用,或需要离线访问时,将数据存储在本地是理想的选择。在嵌入式模式下,数据库库是程序的一部分,处理数据无需任何服务器/服务(无论是本地还是远程)。
半本地存储 - 与本地存储类似,此类别中的“半”是指使用与程序运行在同一台机器上的数据库服务器,而不是嵌入式库(因为对于某些数据库来说,这不是一个选项)。
数据的存储和访问方式
SQL 数据库 ——以表格形式存储结构化数据(每行一个条目),并提供查询语言来访问和创建新数据集。
-
键值存储 - 使用关联数组(映射/字典)存储任意数据作为值(通常是序列化的),可通过数字/字符串键访问。
-
文档库 - 存储“文档”(JSON、XML 或任意数据),并提供根据各种条件对这些文档进行分组和搜索的方法。
-
对象数据库 ——结合了上述类型的各种方法,支持将数据表示为对象,通常与对象(Go 结构体)紧密集成。
-
图数据库——将数据表示为节点和边的集合——在多层关系是数据最重要部分的应用中非常有用。
数据的使用方式(大多数情况下)
在这个类别中,你的项目最终使用多个数据库的情况其实很常见,因为它实际上区分了你的应用程序的用途和所需功能。
-
数据入口数据库 - 日志记录、追踪、监控、时间序列
-
缓存存储 ——用于提升性能和降低延迟的操作缓存
-
分析数据库 ——最适合执行数据分析,通常会附带用于这些目的的工具。
用例
我挑选了一些适用于最常见使用场景的有趣数据库。
监测、追踪、分析
- Prometheus - 远程服务器、数据入口、分析
- InfluxDB - 远程服务器、数据入口、分析
- Jaeger - 远程服务器、追踪、监控
通用 SQL 存储
- TiDB—— 远程服务器,分布式,可扩展,符合 ACID 标准,兼容 MySQL 协议
- CockroachDB—— 远程服务器,分布式,可扩展,符合 ACID 标准
- rqlite - 远程服务器,分布式,可扩展,基于 SQLite
而且还有大量的客户端和 ORM 用于“标准”SQL 服务器,因此如果您已经拥有现有的 SQL 服务器基础架构,那么连接到它应该不会有任何问题。
键值存储
对象存储
- ObjectBox - 本地/嵌入式,符合 ACID 标准,支持事务和查询
然而,Go 语言中这类工具似乎相当缺乏,不过,针对键值存储和 SQL 数据库的 ORM 却有很多:
希望这能为你的下一个项目提供一些思路。如果你觉得你最喜欢的库应该列入其中,或者你觉得有什么遗漏,请在评论区告诉我。
文章来源:https://dev.to/ivan/storing-data-ingo-17me