PostgreSQL schemaless 的实现(类mongodb collection)

简介:

标签

PostgreSQL , schemaless , mongodb


背景

使用mongodb时,并不需要先建表(collection),直接就可以往里面写,原因是collection本事就是固定的BSON结构。

所以当用户插入时,如果表不存在,建一个BSON结构的colleciton即可。

而关系数据库无法做到这一点,因为关系数据库的表结构都是事先构建,并且在写入数据时,是需要检查对应的类型,约束的。

那么有没有办法让PostgreSQL关系数据库也实现类似mongo这种schemaless的表呢?

函数式写入

用户通过调用函数,写入数据。

在函数中处理并实现schemaless。

例子

创建一个自动建表的函数,用于自动创建目标表。

create or replace function create_schemaless(target name) returns void as $$  
declare  
begin  
  execute format('create table if not exists %I (content jsonb)', target);  
exception when others then  
  return;  
end;  
$$ language plpgsql strict;  

创建一个插入数据的函数,使用动态SQL,如果遇到表不存在的错误,则调用建表函数进行建表。

create or replace function ins_schemaless(target name, content jsonb) returns void as $$  
declare  
begin  
  execute format('insert into %I values (%L)', target, content);  
  exception   
    WHEN SQLSTATE '42P01' THEN   
    perform create_schemaless(target);  
    execute format('insert into %I values (%L)', target, content);   
end;  
$$ language plpgsql strict;  

调用函数插入数据,不需要建表,会自动创建。

postgres=# select ins_schemaless('abcde','{"a":123.1}');  
 ins_schemaless   
----------------  
   
(1 row)  
  
postgres=# select * from abcde;  
   content      
--------------  
 {"a": 123.1}  
(1 row)  
  
postgres=# select ins_schemaless('abcde','{"a":123.1}');  
 ins_schemaless   
----------------  
   
(1 row)  
  
postgres=# select * from abcde;  
   content      
--------------  
 {"a": 123.1}  
 {"a": 123.1}  
(2 rows)  
  
postgres=# select ins_schemaless('abcdefg','{"a":123.1}');  
 ins_schemaless   
----------------  
   
(1 row)  
  
postgres=# select * from abcdefg;  
   content      
--------------  
 {"a": 123.1}  
(1 row)  

函数支持并发插入,不会相互影响。

性能

由于使用了动态SQL,性能略差。

transaction type: ./test.sql  
scaling factor: 1  
query mode: prepared  
number of clients: 32  
number of threads: 32  
duration: 120 s  
number of transactions actually processed: 26908558  
latency average = 0.143 ms  
latency stddev = 1.397 ms  
tps = 224219.413026 (including connections establishing)  
tps = 224353.960206 (excluding connections establishing)  
script statistics:  
 - statement latencies in milliseconds:  
         0.143  select ins_schemaless('c','{}');  

使用绑定变量,性能如下。

transaction type: ./test.sql  
scaling factor: 1  
query mode: prepared  
number of clients: 32  
number of threads: 32  
duration: 120 s  
number of transactions actually processed: 39684200  
latency average = 0.097 ms  
latency stddev = 2.192 ms  
tps = 330698.368601 (including connections establishing)  
tps = 330708.294542 (excluding connections establishing)  
script statistics:  
 - statement latencies in milliseconds:  
         0.097  insert into c values ('{}');  

损失11万的QPS,获得schemaless的能力,要不要呢?

当然,如果是从内核层面来支持就更爽了,性能问题可能也能得到解决,比如。

insert into schemaless tbl values (jsonb);  
目录
相关文章
|
存储 关系型数据库 MySQL
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
|
存储 关系型数据库 MySQL
四种数据库对比MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景
四种数据库对比 MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景
|
NoSQL Cloud Native 关系型数据库
云原生数据库比较:MySQL、PostgreSQL、MongoDB和Cassandra的优势与劣势
选择适合自己应用的云原生数据库需要考虑多个因素,包括数据模型、性能需求、扩展性、学习曲线等。如果应用需要严格的 ACID 事务,关系型数据库如 MySQL 或 PostgreSQL 是不错的选择。如果应用需要灵活的数据模型和快速迭代开发,MongoDB 可能更适合。而对于大规模数据存储和高可用性需求,Cassandra 可能是一个值得考虑的选项。
2417 3
云原生数据库比较:MySQL、PostgreSQL、MongoDB和Cassandra的优势与劣势
|
SQL 存储 NoSQL
「技术选型」比较MongoDB和PostgreSQL:谁才是王者?
「技术选型」比较MongoDB和PostgreSQL:谁才是王者?
|
存储 NoSQL 关系型数据库
「数据库选型」抛弃MongoDB,拥抱PostgreSQL,工作更轻松
「数据库选型」抛弃MongoDB,拥抱PostgreSQL,工作更轻松
|
存储 NoSQL Oracle
「数据库选型」卫报从MongoDB迁移到Amazon RDS上的PostgreSQL
「数据库选型」卫报从MongoDB迁移到Amazon RDS上的PostgreSQL
|
存储 缓存 NoSQL
分布式服务器框架之Servers.Core中 实现Log模块设计 写入MongoDB数据库
游戏服务器中都需要用到Log模块,log模块存在的意义第一个是将log输出到控制台又或者是写入到log文件中,出了BUG方便定位;第二是常用于将用户的数据(例如玩家登录、道具购买量)将这种log统计到数据库中,方便统计用户留存信息、数据分析等。
|
NoSQL MongoDB 数据库
分布式服务器框架之Server.Core库中实现YFUniqueEntity、YFUniqueIDBase 管理MongoDB 自定义Id的自增
YFUniqueEntity是数据库中的结构,GetUniqueID函数中会根据Type和自增步长去数据库中寻找该类型的当前ID是多少,然后会用当前的Id去加上步长,把更新后的新ID插入到MongoDB中记录着ID的那张表里。
|
5月前
|
NoSQL MongoDB 数据库
数据库数据恢复—MongoDB数据库数据恢复案例
MongoDB数据库数据恢复环境: 一台操作系统为Windows Server的虚拟机上部署MongoDB数据库。 MongoDB数据库故障: 工作人员在MongoDB服务仍然开启的情况下将MongoDB数据库文件拷贝到其他分区,数据复制完成后将MongoDB数据库原先所在的分区进行了格式化操作。 结果发现拷贝过去的数据无法使用。管理员又将数据拷贝回原始分区,MongoDB服务仍然无法使用,报错“Windows无法启动MongoDB服务(位于 本地计算机 上)错误1067:进程意外终止。”
|
5月前
|
缓存 NoSQL Linux
在CentOS 7系统中彻底移除MongoDB数据库的步骤
以上步骤完成后,MongoDB应该会从您的CentOS 7系统中被彻底移除。在执行上述操作前,请确保已经备份好所有重要数据以防丢失。这些步骤操作需要一些基本的Linux系统管理知识,若您对某一步骤不是非常清楚,请先进行必要的学习或咨询专业人士。在执行系统级操作时,推荐在实施前创建系统快照或备份,以便在出现问题时能够恢复到原先的状态。
471 79

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版
  • 推荐镜像

    更多