PostgreSQL:语言基础与数据库操作

🧑 博主简介:CSDN博客专家历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程高并发设计Springboot和微服务,熟悉LinuxESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作请加本人wx(注明来自csdn):foreast_sea

在这里插入图片描述


在这里插入图片描述

PostgreSQL:语言基础与数据库操作

引言

在当今数据驱动的数字世界中,数据库技术如同现代城市的交通网络,承载着海量数据的流动与存储。作为企业级开源数据库的标杆,PostgreSQL凭借其强大的扩展性、严格的ACID特性和丰富的功能集,已经成为支撑现代应用的基石。根据2023年DB-Engines排名统计,PostgreSQL连续五年蝉联"年度数据库"称号,其市场份额增长率高达36.7%,远超其他关系型数据库。

但真正掌握PostgreSQL的奥秘远不止于简单的CRUD操作。许多开发者在数据库设计初期往往忽视模式(Schema) 的规划,导致后期面临数据冗余查询性能低下等问题。就像建筑师需要精确的蓝图才能建造摩天大楼,数据库工程师必须深入理解模式的组织原则。在电商系统的典型场景中,不合理的模式设计可能使订单表与用户表产生循环依赖,或在促销活动期间因缺乏有效约束导致数据异常。

本文将以PostgreSQL 15为基准版本(2023年1月发布),深入剖析从模式设计到复杂查询优化的全链路实践。我们将通过一个在线教育平台的数据库设计案例,演示如何利用检查约束保证课程价格的合理性,使用物化视图加速复杂的报表查询,以及通过CTE(公共表表达式) 优化多层嵌套查询。所有代码示例均经过PG15环境实测验证,确保开发者可直接应用于生产环境。

1. 数据库与模式(Schema)的创建与管理

1.1 数据库的生命周期管理

-- 创建支持中文的数据库
CREATE DATABASE edu_platform ENCODING 'UTF8' LC_COLLATE 'zh_CN.utf8' LC_CTYPE 'zh_CN.utf8'TEMPLATE template0;-- 查看数据库属性
SELECT datname, encoding, datcollate 
FROM pg_database 
WHERE datname = 'edu_platform';-- 安全删除数据库(确保无活跃连接)
SELECT pg_terminate_backend(pid) 
FROM pg_stat_activity 
WHERE datname = 'edu_platform';DROP DATABASE IF EXISTS edu_platform;

1.2 模式的战略布局

-- 创建核心业务模式
CREATE SCHEMA course_management AUTHORIZATION dba_adminCREATE ROLE instructor;-- 修改模式所有权
ALTER SCHEMA course_management OWNER TO platform_admin;-- 跨模式搜索路径优化
SET search_path TO course_management, public;-- 查看模式权限
SELECT nspname, rolname AS owner 
FROM pg_namespace 
JOIN pg_roles ON (pg_namespace.nspowner = pg_roles.oid);

1.3 模式迁移策略

-- 使用扩展实现模式版本控制
CREATE EXTENSION pg_tle;  -- Trusted Language Extension-- 创建模式变更记录表
CREATE TABLE schema_migrations (version BIGINT PRIMARY KEY,description TEXT NOT NULL,applied_at TIMESTAMPTZ DEFAULT NOW()
);-- 典型迁移文件示例(V202307__add_course_schedule.sql)
BEGIN;
ALTER TABLE courses ADD COLUMN schedule JSONB;
CREATE INDEX idx_course_schedule ON courses USING GIN (schedule);
INSERT INTO schema_migrations VALUES (202307, 'Add course schedule');
COMMIT;

2. 表操作:结构设计的艺术

2.1 表创建进阶技巧

-- 包含分区和存储参数的表设计
CREATE TABLE course_enrollments (enrollment_id BIGINT GENERATED ALWAYS AS IDENTITY,user_id BIGINT NOT NULL,course_id INTEGER NOT NULL,enrolled_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),progress NUMERIC(5,2) CHECK (progress BETWEEN 0 AND 100),CONSTRAINT pk_enrollment PRIMARY KEY (enrollment_id)
) PARTITION BY RANGE (enrolled_at)
WITH (autovacuum_enabled = true,fillfactor = 80
);-- JSONB与全文检索结合
CREATE TABLE course_contents (content_id UUID DEFAULT gen_random_uuid(),course_id INTEGER NOT NULL,metadata JSONB NOT NULL,search_vector tsvector GENERATED ALWAYS AS (to_tsvector('english', coalesce(metadata->>'title','') || ' ' ||coalesce(metadata->>'description',''))STORED,PRIMARY KEY (content_id)
);CREATE INDEX idx_content_search ON course_contents USING GIN (search_vector);

2.2 表结构演进策略

-- 零停机时间变更示例
BEGIN;
ALTER TABLE users ADD COLUMN IF NOT EXISTS mfa_enabled BOOLEAN DEFAULT false;
ALTER TABLE users ALTER COLUMN email SET DATA TYPE VARCHAR(320);
CREATE INDEX CONCURRENTLY idx_user_active ON users(id) WHERE is_active;
COMMIT;-- 复杂列修改(使用 USING 表达式)
ALTER TABLE course_reviews 
ALTER COLUMN rating TYPE SMALLINT 
USING CASE WHEN rating BETWEEN 1 AND 5 THEN rating::SMALLINTELSE NULL 
END;

3. CRUD操作:性能与安全的平衡

3.1 高效插入策略

-- 批量插入优化
INSERT INTO course_modules (course_id, module_title, duration)
SELECT course_id, title || ' Module', duration * 1.2
FROM draft_courses
WHERE status = 'approved'
ON CONFLICT (course_id, module_title) 
DO UPDATE SET duration = EXCLUDED.duration;-- 使用COPY命令加载数据
COPY student_profiles (user_id, bio, expertise_area)
FROM PROGRAM 'curl https://data-source/students.csv'
WITH (FORMAT csv, HEADER true);

3.2 智能查询优化

-- 窗口函数应用
SELECT course_id,AVG(rating) OVER (PARTITION BY course_id) AS avg_rating,PERCENT_RANK() OVER (ORDER BY enrollment_count DESC) AS popularity_rank
FROM (SELECT c.course_id, COUNT(e.enrollment_id) AS enrollment_count,AVG(r.rating) AS ratingFROM courses cLEFT JOIN course_enrollments e USING (course_id)LEFT JOIN course_reviews r USING (course_id)GROUP BY c.course_id
) AS course_stats;-- JSONB路径查询
SELECT content_id, metadata->'author'->>'name' AS author_name,metadata #> '{sections, 0, duration}' AS first_section_duration
FROM course_contents
WHERE metadata @> '{"tags": ["programming"]}';

4. 约束:数据完整性的守护者

4.1 高级约束技术

-- 排除约束(防止时间重叠)
CREATE TABLE course_schedules (course_id INTEGER NOT NULL,schedule_range TSTZRANGE,EXCLUDE USING GIST (course_id WITH =,schedule_range WITH &&)
);-- 自定义域类型约束
CREATE DOMAIN course_price AS NUMERIC(10,2)
CHECK (VALUE BETWEEN 0 AND 10000 AND VALUE % 5 = 0  -- 价格必须是5的倍数
);CREATE TABLE courses (price course_price NOT NULL
);

5. 视图与临时表:灵活的数据视角

5.1 物化视图优化

-- 自动刷新物化视图
CREATE MATERIALIZED VIEW course_statistics
AS
SELECT c.course_id,COUNT(e.enrollment_id) AS total_enrollments,AVG(r.rating) AS average_rating
FROM courses c
LEFT JOIN course_enrollments e USING (course_id)
LEFT JOIN course_reviews r USING (course_id)
GROUP BY c.course_id
WITH DATA;-- 使用pg_cron定时刷新
SELECT cron.schedule('refresh-course-stats', '0 3 * * *', $$REFRESH MATERIALIZED VIEW CONCURRENTLY course_statistics$$);

5.2 临时表实战应用

-- 事务级临时表处理复杂ETL
BEGIN;
CREATE TEMP TABLE temp_user_analysis ON COMMIT DROP AS
SELECT user_id,SUM(CASE WHEN progress = 100 THEN 1 ELSE 0 END) AS completed_courses,AVG(progress) FILTER (WHERE progress > 0) AS avg_progress
FROM course_enrollments
GROUP BY user_id;EXPLAIN ANALYZE 
SELECT * FROM temp_user_analysis 
WHERE completed_courses > 5;
COMMIT;

结语:持续演进的数据库艺术

PostgreSQL 15的新特性如MERGE命令、JSON_OBJECT构造函数等,正在不断扩展其应用边界。建议开发者关注以下前沿方向:

  1. 向量相似度搜索:结合pgvector扩展实现AI特征检索
  2. 分布式架构:使用Citus实现水平扩展
  3. 时序数据优化:TimescaleDB的深度集成
  4. 机器学习集成:MADlib库的统计分析应用

参考文献

  1. PostgreSQL Global Development Group. (2023). PostgreSQL 15 Documentation. https://www.postgresql.org/docs/15/
  2. Riggs, S. et al. (2022). PostgreSQL 14 Administration Cookbook. Packt Publishing
  3. Ants Aasma. (2023). Deep Dive into PostgreSQL Indexing. PGConf.EU
  4. Hironobu Suzuki. (2021). The Internals of PostgreSQL. ISBN 978-1-098-09290-0
  5. AWS Database Blog. (2023). Best Practices for Schema Design in Amazon Aurora PostgreSQL

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/38814.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KMP算法

KMP算法 为什么叫做KMP呢。 因为是由这三位学者发明的:Knuth,Morris和Pratt,所以取了三位学者名字的首字母。所以叫做KMP next数组就是一个前缀表(prefix table)。 前缀表是用来回退的,它记录了模式串与…

3D点云数据处理中的聚类算法总结

1.欧式聚类: 基于点的空间距离(欧几里得距离)来分割点云,将距离较近的点归为同一簇。 欧式聚类需要的参数:邻域半径R,簇的最小点阈值minPts,最大点数阈值maxPts。 实现效率: O(n * log n) 实现…

WRC世界机器人大会-2024年展商汇总

2024世界机器人大会 时间:2024年8月21日至25日 地点:北京经济技术开发区北人亦创国际会展中心 大会主题:共育新质生产力,共享智能新未来 2024世界机器人博览会亮点纷呈,20余款人形机器人整机将亮相博览会&#xff…

拉取镜像,推送到阿里云镜像仓库

需求背景:在学习k8s,虚拟机无法正常拉取 wangyanglinux/tools:busybox 镜像。 解决办法:将墙外镜像拉到国内(阿里云)再使用 准备工作需要创建对应的镜像仓库,然后再进行推送 1. 拉取镜像 docker pull …

DeepSeek和Kimi在Neo4j中的表现

以下是2个最近爆火的人工智能工具, DeepSeek:DeepSeek Kimi: Kimi - 会推理解析,能深度思考的AI助手 1、提示词: 你能帮我生成一个知识图谱吗,等一下我会给你一篇文章,帮我从内容中提取关键要素,然后以N…

哈尔滨工业大学DeepSeek公开课人工智能:大模型原理 技术与应用-从GPT到DeepSeek|附视频下载方法

导 读INTRODUCTION 今天继续哈尔滨工业大学车万翔教授带来了一场主题为“DeepSeek 技术前沿与应用”的报告。 本报告深入探讨了大语言模型在自然语言处理(NLP)领域的核心地位及其发展历程,从基础概念出发,延伸至语言模型在机器翻…

redis解决缓存穿透/击穿/雪崩

文章目录 1.缓存穿透1.1 概念1.2 解决方案1.2.1 缓存空对象1.2.2 布隆过滤 1.2 店铺查询使用缓存穿透解决方案1.2.1 流程 2.缓存雪崩2.1 什么是缓存雪崩?2.2 雪崩解决方案 3.缓存击穿3.1 什么是缓存击穿?3.2解决方案3.2.1 基于互斥锁解决缓存击穿问题&am…

不连续平面提取

不连续平面提取 提取流程 #mermaid-svg-Y87uP8WsVRmPYriG {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Y87uP8WsVRmPYriG .error-icon{fill:#552222;}#mermaid-svg-Y87uP8WsVRmPYriG .error-text{fill:#552222;s…

大语言模型-2.2/3-主流模型架构与新型架构

简介 本博客内容是《大语言模型》一书的读书笔记,该书是中国人民大学高瓴人工智能学院赵鑫教授团队出品,覆盖大语言模型训练与使用的全流程,从预训练到微调与对齐,从使用技术到评测应用,帮助学员全面掌握大语言模型的…

数据库操作练习

一.向heros表中新增一列信息,添加一些约束,并尝试查询一些信息 //向表中添加一列age信息 alter table heros add column age int;//id列添加主键约束,设置自增 alter table heros modify column id int auto_increment primary key;//name列…

CTF【WEB】学习笔记1号刊

Kali的小工具箱 curl www.xxx.com:查看服务器响应返回的信息 curl -I www.xxx.com:查看响应的文件头 一、cmd执行命令 ipconfig:ip地址配置等; 二、 Kali操作 1.sudo su; 2.msfconsole 3.search ms17_010 永恒之蓝&#xff…

在 SaaS 应用上构建 BI 能力的实战之路

SaaS 产品在持续运营过程中积累了大量数据,这些数据不仅是数字的记录,更是洞察市场趋势、优化产品功能、提升用户体验的宝贵资源。 因此,大部分的 SaaS 产品在发展到一定阶段后,都会开始构建自己的报表模块或分析模块,…

gonet开源游戏服务器环境配置

1.mysql搭建 搜索mysql-server apt安装包名 sudo apt search mysql-server 安装mysql-server sudo apt-get install mysql-server 安装完成后会,启动mysql服务及创建系统服务 查看服务状态 systemctl status mysql.service 使用超级权限登陆mysql sudo mysql 授…

STM32基础篇(五)------TIM定时器比较输出

简介 定时器的类型 在《STM32F10xxx参考手册(中文).pdf》中可以看到下面三个章节 因此可以得到 高级定时器含有通用定时器的所有功能,通用定时器含有基本定时器的所有功能!!!!!…

基于STM32的两路电压测量仿真设计Proteus仿真+程序设计+设计报告+讲解视频

基于STM32两路电压测量仿真设计(Proteus仿真程序设计设计报告讲解视频) 仿真图Proteus 8.9 程序编译器:keil 5 编程语言:C语言 设计编号:C0106 1.主要功能 基于STM32单片机设计一个双路电压检测器 1.系统可以测量两路输入电…

210、【图论】课程表(Python)

题目 思路 这道题本质上是一个拓扑排序。每次先统计每个点的入度个数、然后再统计点与点之间的邻接关系,找到入度为0的点作为起始遍历点。之后每遍历到这个点之后,就把这个点后续的邻接关系边的点入度减去一。当某个点入度为0时,继续被加入其…

react 杂记2 优化hook

useEffect 每个Fiber节点都会为该组件的所有effec对象​维护一个链表, 场景​类组件方法函数组件等效写法差异说明挂载时执行componentDidMount()useEffect(fn, [])useEffect 副作用在浏览器绘制后异步执行;componentDidMount 是同步的。更新时执行componentDidUp…

Java内存泄漏、CPU飙升排查

在Java应用开发中&#xff0c;内存泄漏和CPU飙升是两类高频出现的生产问题&#xff0c;也是常见的面试问题。这里通过一些demo进行实践。 内存泄漏 private static List<byte[]> leakList new ArrayList<>();GetMapping("/memory/leak") public void …

【搜索】dfs(回溯、剪枝、记忆化)

个人主页&#xff1a;Guiat 归属专栏&#xff1a;我讲你听 文章目录 1. dfs 回溯1.1 回溯介绍1.2 回溯模板1.3 回溯经典题目 2. dfs 剪枝2.1 剪枝介绍2. 2 剪枝模板2.3 经典题目 3. dfs 记忆化3.1 记忆化介绍3.2 记忆化示例 正文 1. dfs 回溯 1.1 回溯介绍 核心思想&#xff…

emWin自定义键盘布局

emWin V6.46提供了自带的键盘控件&#xff0c;用起来功能还是比较齐全的。但是有些时候自带的布局不能满足要求&#xff0c;此时可用键盘的结构体来自定义布局。 KEYDEF_KEYBOARD MyNumPad;static KEYDEF_AREA NumPadKeyArea[4] {{10, 0, 720, 250}, //每行按钮的坐标和占用…