下面列出一些 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","开源"}');
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值