postgresql 标签分组实战(可用于用户画像的实践)-数组篇

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: 基于数组方式方面的基础应用,如有更大数据量的标签组合的时候,请参考下德哥写的文章 https://developer.aliyun.com/article/307731

postgresql 标签分组实战

数据初始化

构建用户标签关系表
drop table IF  EXISTS t_user_tag;
create table IF NOT EXISTS t_user_tag(userid int8 not null primary key,tagids int[]);
初始化随机长度数据,假设标签范围1-10
-- 生成随机长度的数据数据 ,这样子数据就比较离散点,做查询索引的话,才容易命中,如果都是重复数据,做索引意义不大
do language plpgsql $$
declare 
begin  
  for i in 1..1000000 loop  
      insert into t_user_tag values (i,
            (select array_agg(ceil(random()*10)::int) from generate_series(1,ceil(random()*10)::int))
            ); 
  end loop;  
end;  
$$; 

数据写入与变更操作演示

插入1条数据
-- 插入 10000001 用户数据, ARRAY 数组的代表方式
INSERT INTO t_user_tag
    VALUES (10000001,
    ARRAY[1, 2, 3, 4,5]);
-- 查询该数据
select * from t_user_tag where userid= 10000001;

更新数据
-- 更新数字的第一个元素为null,pg默认下标从1开始,也可以自己自定义
update t_user_tag set tagids[1] = null
where userid = 10000001;
-- 查询该数据
select * from t_user_tag where userid= 10000001;

-- 只保留2-4的4位数值
update t_user_tag set tagids = tagids[2:5]
where userid = 10000001;
-- 查询该数据
select * from t_user_tag where userid= 10000001;

update t_user_tag set tagids[6:7] = '{6,7}'
where userid = 10000001;
-- 查询该数据
select * from t_user_tag where userid= 10000001;

更新时使用函数操作(参考: http://www.postgres.cn/docs/14/functions-array.html

追加写入数据

update t_user_tag set tagids= array_append(tagids,11)
where userid = 10000001;
-- 查询该数据
select * from t_user_tag where userid= 10000001;

-- 另外一种追加方式
update t_user_tag set tagids= tagids||22
where userid = 10000001;
-- 查询该数据
select * from t_user_tag where userid= 10000001;

删除指定数据
-- 从数组中移除所有等于给定值的所有元素
update t_user_tag set tagids=  array_remove(tagids, 2)
where userid = 10000001;
-- 查询该数据
select * from t_user_tag where userid= 10000001;

批量修改
-- 将每一个等于给定值的数组元素替换成一个新值
-- 比如说将所有的 6 改成 3
update t_user_tag set tagids = array_replace(tagids,6,3)
where userid = 10000001;
-- 查询该数据
select * from t_user_tag where userid= 10000001;

数据查询

假设求取的是都包含了 标签5 和标签6的情况,有哪些
select * from t_user_tag
where  tagids @> '{6,5}' limit 10;

假设求取的是 包含了 标签5和标签6,并且最多标签为 5 个的情况下有哪些用户
select * from t_user_tag
where  tagids @> '{6,5}' 
and  array_length(tagids,1)<=5
limit 10;

假设求取的是只要有 标签7 或 标签9 的情况都筛选出来
select * from t_user_tag
where  tagids && '{7,9}' 
limit 10;

统计加速

构建索引
-- 构建索引 gin索引或 rum索引(支持排序操作)
CREATE INDEX idx_t_user_tag on t_user_tag using gin(tagids);
统计查询
-- 耗时90ms,其实内网下应该会更小的耗时
select count(1) from t_user_tag
where  tagids @> ARRAY[1,2,3];

统计分析

全表统计的情况下
select count(1) from t_user_tag

有以上基础后,可以尝试更大数据量的快速检索,例如2000亿数据量的检索如何实时实现

https://developer.aliyun.com/article/307731

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
7月前
|
存储 JSON 关系型数据库
《Postgresql实战》笔记(二)
《Postgresql实战》笔记(二)
84 0
|
4月前
|
搜索推荐 前端开发 算法
基于用户画像及协同过滤算法的音乐推荐系统,采用Django框架、bootstrap前端,MySQL数据库
本文介绍了一个基于用户画像和协同过滤算法的音乐推荐系统,使用Django框架、Bootstrap前端和MySQL数据库构建,旨在为用户提供个性化的音乐推荐服务,提高推荐准确性和用户满意度。
287 7
基于用户画像及协同过滤算法的音乐推荐系统,采用Django框架、bootstrap前端,MySQL数据库
|
5月前
|
JavaScript 关系型数据库 API
Nest.js 实战 (二):如何使用 Prisma 和连接 PostgreSQL 数据库
这篇文章介绍了什么是Prisma以及如何在Node.js和TypeScript后端应用中使用它。Prisma是一个开源的下一代ORM,包含PrismaClient、PrismaMigrate、PrismaStudio等部分。文章详细叙述了安装PrismaCLI和依赖包、初始化Prisma、连接数据库、定义Prisma模型、创建Prisma模块的过程,并对比了Prisma和Sequelize在Nest.js中的使用体验,认为Prisma更加便捷高效,没有繁琐的配置。
200 7
Nest.js 实战 (二):如何使用 Prisma 和连接 PostgreSQL 数据库
|
6月前
|
自然语言处理 关系型数据库 数据库
技术经验解读:【转】PostgreSQL的FTI(TSearch)与中文全文索引的实践
技术经验解读:【转】PostgreSQL的FTI(TSearch)与中文全文索引的实践
71 0
|
关系型数据库 数据管理 Go
《PostgreSQL数据分区:原理与实战》
《PostgreSQL数据分区:原理与实战》
206 0
|
7月前
|
弹性计算 关系型数据库 数据库
开源PostgreSQL在倚天ECS上的最佳优化实践
本文基于倚天ECS硬件平台,以自顶向下的方式从上层应用、到基础软件,再到底层芯片硬件,通过应用与芯片的硬件特性的亲和性分析,实现PostgreSQL与倚天芯片软硬协同的深度优化,充分使能倚天硬件性能,帮助开源PostgreSQL应用实现性能提升。
|
7月前
|
SQL 运维 关系型数据库
基于AnalyticDB PostgreSQL的实时物化视图研发实践
AnalyticDB PostgreSQL版提供了实时物化视图功能,相较于普通(非实时)物化视图,实时物化视图无需手动调用刷新命令,即可实现数据更新时自动同步刷新物化视图。当基表发生变化时,构建在基表上的实时物化视图将会自动更新。AnalyticDB PostgreSQL企业数据智能平台是构建数据智能的全流程平台,提供可视化实时任务开发 + 实时数据洞察,让您轻松平移离线任务,使用SQL和简单配置即可完成整个实时数仓的搭建。
144002 8
|
7月前
|
关系型数据库 网络安全 数据库
《Postgresql实战》笔记(一)
《Postgresql实战》笔记(一)
104 0
|
7月前
|
SQL 关系型数据库 MySQL
MySQL【实践 02】MySQL迁移到PostgreSQL数据库的语法调整说明及脚本分享(通过bat命令修改mapper文件内的SQL语法)
MySQL【实践 02】MySQL迁移到PostgreSQL数据库的语法调整说明及脚本分享(通过bat命令修改mapper文件内的SQL语法)
269 0
|
存储 关系型数据库 数据库
沉浸式学习PostgreSQL|PolarDB 13: 博客、网站按标签内容检索, 并按匹配度排序
本文主要教大家怎么用好数据库, 而不是怎么运维管理数据库、怎么开发数据库内核.
773 0