使用PostgreSQL数据库作为简单键值存储的最佳方式

2022-09-02 09:31:06

我被要求使用postgreSQL数据库,它将取代我目前使用的berkeleyDB。虽然;我意识到这不是一个理想的情况,它超出了我的控制范围。

所以问题是...如果你被要求将postgreSQL变成一个键值存储,你会如何做到这一点,同时让它尽可能高效?

我的值是字节数组,我的键是字符串,我可以对这些字符串的长度施加一些限制。

我认为我应该使用一个blob来表示我的值和持有密钥的主键列,但是由于我只是冒险进入这个旅程,我很好奇堆栈溢出社区中是否有人这样做了,或者是否有任何特定的“陷阱”我应该注意。


答案 1

Postgresql中正确执行此操作的扩展称为hstore。它的工作方式与您期望的其他键值存储系统类似。只需加载扩展程序即可。语法是独一无二的,但如果你曾经使用过redis或mongo,你会很快得到它。不要让它比现在更难。我知道,我们通常不能选择我们的工具,而必须这样做。
这是文档页面:

http://www.postgresql.org/docs/9.1/static/hstore.html


答案 2

另一种选择是使用 JSON 或 JSONB,并在密钥上具有唯一的哈希索引。

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

CREATE TABLE key_values (
    key uuid DEFAULT uuid_generate_v4(),
    value jsonb
);

CREATE INDEX idx_key_values ON key_values USING hash (key);

一些查询

SELECT * FROM key_values WHERE key = '1cfc4dbf-a1b9-46b3-8c15-a03f51dde891';
Time: 0.514 ms
postgres=# SELECT * FROM key_values WHERE key = '1cfc4dbf-a1b9-46b3-8c15-a03f51dde890';
Time: 1.747 ms

postgres=# do $$
begin
for r in 1..1000 loop
INSERT INTO key_values (value)
VALUES ('{"somelarge_json": "bla"}');
end loop;
end;
$$;
DO
Time: 58.327 ms

您无法像使用 B 树那样运行高效的范围查询,但它应具有更好的读/写性能。指数应该小60%左右。


推荐