PostgreSQL

你可能会说

AI 推荐我用 Supabase 和 PostgreSQL 存用户和订单,它和普通存文件有什么区别?

现代 Web 项目中最主流的开源关系型数据库,擅长按结构存储并安全查询复杂业务数据例如用户、订单与支付流水需要严格关联且不能存丢,PostgreSQL 通过数据表、外键约束和事务保证数据一致。除了标准 SQL 与高并发,它还内置 JSON 查询和向量检索,是 Supabase、Neon 等 AI 编程后端标配的底层数据库。
也常被叫作PostgresPGPostgreSQL 数据库Postgres 数据库
TABLE orders (id, user_id, amount) FOREIGN KEY (user_id) REFERENCES users(id)
order_iduser_idstatus
#1001u_42paid (事务提交)
#1002u_88pending
容易混淆?这样区分
PostgreSQL数据库 Database

数据库 Database 是所有存储并管理数据的系统总称;PostgreSQL 是一款遵循 ACID 标准、工业级成熟的开源关系型数据库软件与具体引擎。

PostgreSQLSQL

SQL 是用来查询和操作关系型数据的通用结构化语言;PostgreSQL 是执行 SQL 语句并负责磁盘存储、并发控制与事务回滚的数据库系统。

什么时候用

  • 在用户与订单等强关联数据间建立外键,由数据库底层守住引用一致性
    把表结构一起交给 AI
    users.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 语句:必须使用参数化查询防御注入
    把输入直接拼进 SQL
    email = ' 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 向量同一数据库搞定,无需多套系统
延伸阅读 · 权威出处