PostgreSQL
你可能会说
AI 推荐我用 Supabase 和 PostgreSQL 存用户和订单,它和普通存文件有什么区别?
现代 Web 项目中最主流的开源关系型数据库,擅长按结构存储并安全查询复杂业务数据例如用户、订单与支付流水需要严格关联且不能存丢,PostgreSQL 通过数据表、外键约束和事务保证数据一致。除了标准 SQL 与高并发,它还内置 JSON 查询和向量检索,是 Supabase、Neon 等 AI 编程后端标配的底层数据库。
也常被叫作PostgresPGPostgreSQL 数据库Postgres 数据库
容易混淆?这样区分
PostgreSQL≠数据库 Database
数据库 Database 是所有存储并管理数据的系统总称;PostgreSQL 是一款遵循 ACID 标准、工业级成熟的开源关系型数据库软件与具体引擎。
PostgreSQL≠SQL
SQL 是用来查询和操作关系型数据的通用结构化语言;PostgreSQL 是执行 SQL 语句并负责磁盘存储、并发控制与事务回滚的数据库系统。
什么时候用
- 在用户与订单等强关联数据间建立外键,由数据库底层守住引用一致性把表结构一起交给 AIusers.iduuidusers.emailtext · unique输出解释影响几行
- 将关联操作(如扣库存与写订单)包裹在数据库事务中,保证要么全成要么全退删改前先预览影响范围SELECT ... WHERE id=42→确认 1 行→DELETE
- 为高频筛选字段建立索引,并在复杂查询变慢时使用 EXPLAIN 分析耗时先学会读数据查询SELECT * FROM users WHERE id = 42 → 结果42 · 小林
- 利用 JSONB 字段存储动态扩展属性,兼顾关系型严谨与半结构化灵活输入只作为数据SELECT * FROM users WHERE email = $1$1 = "oil@example.com"参数不会被当作另一段 SQL 执行
什么时候不用
- 把订单和库存分别存进两个独立文本文件:程序中途崩溃极易发生死账与超卖未确认条件就在生产库执行写操作当前环境PRODUCTION准备执行UPDATE users ...先在测试数据或事务中验证
- 在客户端直接拼接用户输入生成 SQL 语句:必须使用参数化查询防御注入把输入直接拼进 SQLemail = ' OR 1=1 --SELECT * FROM users WHERE email = '' OR 1=1
- 为所有字段盲目添加索引:过多索引会拖慢写入性能并增加存储开销少了 WHERE 的删除执行DELETE FROM users → 影响12,480 行被删除
- 把数据库端口直接公网免密开放:应配置仅限应用后端连接的网络白名单展示文字不能代替稳定字段只存“高级会员” → 应该plan_id: pro_2026
组成结构 · Anatomy
DATABASE app_productionTABLE users (id, email)TABLE orders (id, user_id, amount)定义了固定列名与数据类型的二维表格,每一行代表一条具体业务记录
通过外键把订单与用户严格绑定,防止产生无主孤儿数据或无效引用
负责并发控制、预写日志(WAL)与崩溃恢复,确保数据安全落盘
常见变体 · Variants
标准关系表Relational Table
users JOIN orders结构明确、需要强一致性与外键约束的核心业务
JSONB 文档JSONB Document
meta->>'theme'
动态配置、不规则表单或快速迭代的原型数据
向量存储Vector (pgvector)
embedding <=> q
AI 检索增强生成 (RAG) 与语义搜索
典型使用场景
用户与订单强一致关系存储
关系约束外键保证订单属于有效用户
用户表users (id: u_42)外键关联orders.user_id校验结果关联有效
尝试插入不存在的 user_id 会被数据库直接拒绝
多表关联统计与流水账单
事务边界扣减库存与创建订单原子执行
BEGIN 开启事务→扣库存 · 写订单→COMMIT 提交
任何一步报错完整回滚,绝不遗留半截脏数据
使用 JSONB 存动态配置
灵活扩展JSONB 字段存储个性化偏好
SELECT preferences->>'theme'FROM usersWHERE preferences->>'lang' = 'zh';
免去频繁修改表结构的成本,同时支持索引
借助 pgvector 实现知识库检索
AI 增强pgvector 插件实现语义检索
用户问题怎么退款?→向量比对命中知识库文档 #42
业务数据与 AI 向量同一数据库搞定,无需多套系统
延伸阅读 · 权威出处