跳到主要内容

表、视图与数据

表是 PostgreSQL 中存储业务数据的核心对象。设计表结构时,需要同时考虑字段类型、主键、约束、索引、权限策略和后续迁移成本。

表结构设计

创建业务表时,建议至少明确以下信息:

设计项建议
主键使用 bigint generated by default as identityuuid,避免使用业务字段作为主键
必填字段对必须存在的数据设置 not null
默认值对创建时间、状态、归属用户等字段设置默认值
唯一约束对邮箱、外部订单号等唯一业务键设置 unique
归属字段多用户数据表建议保留 user_id,便于 RLS 权限控制
create table public.todos (
id bigint generated by default as identity primary key,
user_id varchar(64) not null default auth.uid(),
title text not null,
done boolean not null default false,
priority int not null default 0,
created_at timestamptz not null default now()
);

常用字段类型

类型适用场景
text标题、描述、昵称等文本
boolean开关状态,如是否完成、是否启用
int / bigint数量、排序值、自增主键
numeric金额、精确小数
timestamptz带时区时间,建议用于创建时间和更新时间
jsonb灵活属性、扩展配置、第三方回调原文
uuid分布式 ID、公开 ID
enum小而稳定的固定取值,如订单状态、流程阶段

需要数组类型可参考 数组,需要固定取值集合可参考 枚举类型,需要非结构化字段可参考 JSON 与非结构化数据

约束

约束用于在数据库层保证数据正确性。常见约束包括:

  • primary key:唯一标识一行数据。
  • not null:字段不能为空。
  • unique:字段值不能重复。
  • check:字段值必须满足表达式。
  • foreign key:约束表之间的引用关系。
alter table public.todos
add constraint todos_priority_check check (priority between 0 and 5);

外键使用方式请参考 外键配置

视图

视图适合封装常用查询,或对外暴露裁剪后的字段集合。

create view public.active_todos as
select id, title, priority, created_at
from public.todos
where done = false;

如果底层表启用了 RLS,请确认视图的安全模式。PostgreSQL 15 及以上版本可以使用 security_invoker = true 让视图以调用者权限执行。

create view public.active_todos
with (security_invoker = true) as
select id, title, priority, created_at
from public.todos
where done = false;

更多 RLS 与视图的关系请参考 基础权限

数据管理

开发阶段可以通过 DMC 或控制台进行少量数据维护。批量导入、复杂更新和生产修复建议使用 SQL 脚本,并保留执行记录。

insert into public.todos (title, priority)
values
('准备上线检查清单', 3),
('补充数据库索引', 2);

业务侧读写数据时,可以根据场景选择 SDK、HTTP API 或服务端直连。前端读写用户数据前,应先完成 RLS 策略配置。

变更表结构

线上表结构变更要尽量保持向后兼容。推荐流程是先新增字段并设置默认值,再灰度发布业务代码,最后清理旧字段。

避免在高峰期执行长时间锁表操作。大表新增索引、批量更新和类型转换前,应先在测试环境验证耗时和锁影响。