为您的产品选择数据库听起来是个难题。这些天来,我们工程师有很多选择,这使得这个决定无比艰难。让我们看几个选项。
Redis
Redis 并不是真正的数据库。它是一种键值存储,可将您的数据保存在内存中。如果 Redis 意外重新启动,例如由于电源故障,您将丢失部分或全部密钥,具体取决于配置。不要误会我的意思,我喜欢 Redis;它速度很快,它有很酷的数据结构,比如集合和 HyperLogLog,它甚至可以在集群模式下水平扩展它的大部分特性。
对于这个以及它的许多其他属性,它是高吞吐量系统(如 ML 特征存储、作业队列、Twitter 和 Twitch 1)的首选键值存储。但是,这些系统都不希望您的数据是安全的。事实上,如果它消失了,你的产品应该能够像什么都没发生一样继续运行。对于那些部署、机器学习和它支持的其他功能,被视为很好。
ScyllaDB (and friends)
Scylla 是新来的,至少就数据库而言。它已经存在 6 年了,但它凭借 Discord 2和 Expedia 3等大型部署成为头条新闻。它的理念是键值存储可以快速运行,并且如果您停电,您的数据仍然是安全的,并且可以跨您最喜欢的云的可用区域进行复制。最重要的是,它使用 Cassandra 的 SQL 语法和客户端/服务器协议,因此您可能认为它实际上可以为您的关键业务系统提供动力。
尽管 Scylla 的核心仍然是一个键值存储。我们可以把东西放进去,但以一种有意义的方式把它们放回去仍然是一个挑战。它确实有二级索引,所以如果有一天你想通过电子邮件而不是通过主键找到你的用户,你仍然可以做到,只是速度会慢一些。
但最终,由于没有连接支持或外键,Scylla 表,就像 Redis 键一样,彼此隔离。因此,要了解您在旧金山有多少客户订购了您最畅销的鞋子,您需要一个昂贵的数据仓库,而不是一个GROUP BY city ORDER BY COUNT(*).
您可能认为 DynamoDB、MongoDB 和所有其他类似 SQL 的6更好,但它们都忘记了一个重要事实。
非规范化数据是 DOA
关系是一切的基础,从个人幸福到拥有成功的企业。我们将遇到的大多数问题都涉及理解实体如何协同工作。今天有哪些用户登录?这是用户、登录和时间之间的关系。有多少用户购买了我们最畅销的产品?交付该产品的成本是多少?这些是价格、产品、日期范围、用户和订单之间的关系。
如果我们对这些数据进行非规范化,要么将其扁平化为键值存储,要么仅将其存储在不同数据库的独立表中,我们就会失去以有趣的方式查询它的能力,如果我们失去了这种能力,我们就会停止理解我们的业务。
PostgreSQL
好吧,这有点剧透。
当看到我们的选择时,人们不得不想知道,为什么我们不能吃蛋糕呢?不过,这是一个不好的类比,因为我们并没有要求那么多,而且我们当然可以拥有它。
在可靠性方面,没有更好的选择。PostgreSQL 不会丢失数据。事实上,它有几层故障检查以确保字节输入等于字节输出。当安装在现代 SSD 上时,PostgreSQL 每秒可以处理超过 100k 的写入事务,而不会出汗,并推动 1GB/秒的写入吞吐量。在读取方面,它可以为 PB 级的数据集提供服务,并且可以水平扩展为每秒数百万次读取。这比 web scale 5好。
最重要的是,Postgres 允许您了解您的数据和业务。只需几次加入,您就可以将用户与订单、退款和您的网站访问联系起来。您不需要数据仓库、Spark、Cassandra、大型管道来让它们一起工作,也不需要数据验证脚本。您可以直接从源头阅读、编写和理解。
机器学习来了
了解您的业务是好的,但如果您也可以改进它呢?大多数人都想把意大利面扔到墙上(这没关系),但机器学习允许采用更科学的方法。传统上,机器学习很难与现代数据架构一起使用:使用键值数据库会使大量数据几乎无法访问。但是,使用 PostgresML,您可以使用单个 SQL 查询直接在您的订单表上训练 XGBoost 模型:
SELECT pgml.train(
'Orders Likely To Be Returned', -- name of your model
'regression', -- objective (regression or classification)
'public.orders', -- table
'refunded', -- label (what are we predicting)
'xgboost' -- algorithm
);
SELECT
pgml.predict(
'Orders Likely To Be Returned',
ARRAY[orders.*]) AS refund_likelihood,
orders.*
FROM orders
ORDER BY refund_likelyhood DESC
LIMIT 100;
原文标题:Which Database, That is the Question
原文作者:Lev Kokotov
原文链接:https://postgresml.org/blog/which-database-that-is-the-question/#scylladb-and-friends





