首页 » Web前端 » php列举jsonarray技巧_PostgreSQL 数组类型运用详解

php列举jsonarray技巧_PostgreSQL 数组类型运用详解

访客 2024-12-06 0

扫一扫用手机浏览

文章目录 [+]

我们先对PostgreSQL数据库 (下面简称 PG)大略的先容一下,往后有机会,再单独写一篇专门先容pgSql的文章

The World’s Most Advanced Open Source Relational Database

php列举jsonarray技巧_PostgreSQL 数组类型运用详解

这是PG官网对自己的先容,是的,你没有看错,“天下上最前辈的开源关系型数据库”。
一段严重违反我国广告法的话,上一个敢那么叫嚣的技能是PHP,“天下上最好的措辞”,然后这句话就成了码农界最广为人知的梗,存在于各种笑估中。

php列举jsonarray技巧_PostgreSQL 数组类型运用详解
(图片来自网络侵删)

不过PG并没有由于这样堂堂皇皇地自吹自擂而遭到什么鞭笞或调侃,事实上,无论在务实的码农界,抑或是讲究章法的学术界,人们对PG都是赞许有加,PG是完备当得起这句话的。

下面列出一些PostgreSQL的特点PostgreSQL是一种功能非常完好关系型数据库,由加州大学打算机系开拓PostgreSQL开源协议是类BSD的自有协议 ,这是一种非常友好的协议,不论是商用还是自用,或者修正代码中兴个名拿来卖钱,都没有任何风险PostgreSQL支持的数据类型非常多,除了常用的,还有列举类型, 几何类型,UUID类型 , json类型 , 数组类型 等,个中数组类型 也是本篇文章的目的,先容个中数组类型的利用PostgreSQL 成立时对标的数据库是 Oracle数据库,所有 PostgreSQL 的功能和性能是非常强的。
PostgreSQL 对繁芜SQL的实行,要好于MySql…

还有很多的特性,这里只大略的写几个,上面的几个特点也是我非常在意的,之所 www.helloworld.net 这次改版把Mysql换成了PostgreSQL ,便是有这些缘故原由。

之前很多人问过,hellworld开拓者社区 改版用到了哪些技能栈,个中之一,便是把 Mysql 换成了 PostgreSQL

在改版的过程中,所有的表全部重新设计,这对付后端来说,是一个极其须要勇气的决定,好在我们坚持下来了

在改的过程中,个中有这样一个场景:

一篇博客,有多个标签 ,比如 一个博客,有多线程, 并发 , 线程池 这三个标签

对付这样的需求,我们可以剖析一下

一篇博客,有多个标签一个标签,也可有对应多篇博客

这样就形成了 多对多 的关系,建表的话,就会有一张关联表,大部分会想到这样建表

博客表: blog

标签表: tag

标签博客表: tag_blog

个中各表的字段,如下(大略起见,只列出最少的列):

blog 表:

id 数字类型,博客的 id, 自增长的主键title 字符串类型,博客的标题

tag表:

id 数字类型, 标签的 id , 自增长的主键name 字符串类型,标签的名字

tag_blog :

id 数字类型, 自增长的主键tag_id 标签 id (对应 tag 表中的 id )blog_id 博客id (对应 blog 表中的 id )

上面这个博客标签需求,须要 3 张表,我们知道,PostgreSQL 的列的类型是支持数组类型的

我们是不是可以优化一下上面的需求,把 3 张表变成 1 张表

只保留一张 blog 表,在 blog 表中增加一列 tags , 类似便是 text[ ]

新的博客表字段如下:

blog表:

id 数字类型(bigint),博客的 id, 自增长的主键title 字符串类型(text ),博客的标题tags 字符串数组类型(text[ ] )

为了方便大家测试,建表SQL 如下

CREATE TABLE IF NOT EXISTS public.blog( id bigint NOT NULL DEFAULT nextval('blog_id_seq'::regclass), title text COLLATE pg_catalog."default", tags text[] COLLATE pg_catalog."default", CONSTRAINT blog_pkey PRIMARY KEY (id))TABLESPACE pg_default;ALTER TABLE IF EXISTS public.blog OWNER to postgres;

下面我们针对 tags 字段作一些基本操作

数组类型的基本操作1 查询

现在表中没有数据,我们查询一下看看

select from blog

结果如下:

2 插入数据

插入一条记录,标题是 www.helloworld.net , 对应的标签有3个,分别是 helloworld , 技能 , 社区

insert into blog (title,tags) values('www.helloworld.net','{"helloworld","技能","社区"}')

再次查询

select from blog

结果如下:

可以看到,已经有了一条数据了,tags 数组里面有3个元素,分别是 helloworld , 技能 , 社区

我们再次插入两条数据,方便我们测试

insert into blog (title,tags) values('www.juejin.im','{"掘金","技能","开拓者"}');insert into blog (title,tags) values('www.oschina.net','{"开源中国","oschina","开源"}');

查询结果如下:

3 条件查询3.1 查询标签中有技能标签的博客,语法select from blog where 'xx' = any(数组字段)

sql 语句如下

select from blog where '技能'= any(tags)

查询结果如下:

3.2 查询标签中有helloworld标签或者有开源中国标签的博客

sql语句如下:

select from blog where 'helloworld'= any(tags) or '开源中国' = any(tags)

结果如下:

4 更新4.1 更新标签的名称

我们将 id = 1 的记录的 tags 数组中, 社区改成开拓者社区

把稳:pg中数组类型,索引是从 1 开始,我们将 id = 1 的记录,社区元素索引为3,修正语法为: update 表名 set 字段[index] = 'xx' where id=1

sql如下:

update blog set tags[3] = '开拓者社区' where id=1

再次查询,结果如下:

可以创造,通过 tags[3] = '开拓者社区' ,成功的把 社区修正成了 开拓者社区

4.2 添加一个标签

我们把 id=1 的记录,标签再增加一个 程序员标签

可以利用PostgreSQL的 array_append 函数

利用方法如下:

sql写法如下:

update blog set tags = array_append(tags, '程序员'::text) where id=1

再次查询结果如下:

5 删除

我们删除标签

把 id= 3 的记录中的标签,删除开源

sql如下:

update blog set tags = array_remove(tags, '开源'::text) where id=3

实行后,再次查询,如下:

总结

以上便是关于 PostgreSQL 的数组类型的常见的用法,至于其它的用法,大家可以看一下官方文档,再结合本例的SQL写法

该当很随意马虎就能节制

以上的需求,实在实际运用中并不是适宜用数组类型办理,数组适宜的场景,操作,交互不多,不太主要,可以用

helloworld开拓者社区在改版的过程中,数据库虽然换成了 PostgreSQL ,但是博客的标签这块需求,并没有用这种办法

此例只是方便解释用法,详细实际中怎么用,大家还须要结合自己的业务需求,灵巧选择

如果以为上面的文章对你有帮助,那么我的一点付出是值得的,方便的话,也可以给个关注,感激 ^_^

标签:

相关文章

php文件提交体系技巧_php的文件上传

这里首先声明一下这一章的内容比较多,比较难,你要抱着和自己去世磕的态度。细微之处不放过,多敲多练是王道。 学习就像爬山,得一步一步...

Web前端 2024-12-08 阅读0 评论0