PostgreSQL 表名与字段命名规范:为什么 snake_case 是唯一正确选择
在 PostgreSQL 项目中,表名和字段名的命名方式,从来不是个人偏好问题。
如果你在项目早期没有统一规范,后期一定会遇到这些情况:
- 表名大小写混乱
- SQL 查询必须加双引号
- EF Core 映射异常
- 数据库和代码之间长期不一致
- 新人一写 SQL 就出错
我们在多个 PostgreSQL + EF Core 项目中踩过这些坑,最终只留下了一条结论:
PostgreSQL 中,snake_case 是唯一值得长期使用的命名方式。
PostgreSQL 的一个“隐藏规则”
先说一个很多人第一次用 PostgreSQL 都会踩的坑。
CREATE TABLE SupportTicket (...);
你以为创建的是 SupportTicket,
实际上 PostgreSQL 会把它变成:
supportticket
如果你坚持要保留大小写,只能写成:
CREATE TABLE "SupportTicket" (...);
但代价是:
SELECT * FROM "SupportTicket"; -- 每一次都必须加引号
一旦开始使用双引号,你的数据库就进入了“引号地狱”。
最终结论(可以直接记住)
PostgreSQL 中:
- 表名、字段名统一使用
snake_case- 全部小写
- 永远不要依赖双引号
- 不要使用驼峰命名
这不是偏好,而是 PostgreSQL 的设计现实。
表名命名规范(Table)
✅ 推荐规则
snake_case- 单数
- 语义明确
- 不加前缀
| ❌ 不推荐 | ✅ 推荐 |
|---|---|
SupportTickets | support_ticket |
UserProfiles | user_profile |
tbl_user | user |
为什么用单数?
- 表在语义上更接近 实体 / 聚合根
- 与 DDD 的模型一致
- SQL 语句更自然
字段命名规范(Column)
✅ 基本规则
snake_case- 不加表名前缀
- 语义清晰
| ❌ 不推荐 | ✅ 推荐 |
|---|---|
UserId | user_id |
CreatedAt | created_at |
IsDeleted | is_deleted |
主键与外键命名
主键(Primary Key)
id
id uuid primary key
-- 或
id bigint generated always as identity
主键不需要语义,它只是“身份”。
外键(Foreign Key)
{referenced_table}_id
user_id
order_id
support_ticket_id
布尔字段(Boolean)
is_xxx
has_xxx
is_active
is_deleted
has_attachment
时间字段(Timestamp)
*_at
created_at
updated_at
deleted_at
强烈建议统一使用 UTC 时间。
索引与约束命名规范(强烈推荐)
虽然 PostgreSQL 不强制,但团队必须统一。
pk_{table} -- 主键
fk_{table}_{column} -- 外键
ix_{table}_{column} -- 普通索引
ux_{table}_{column} -- 唯一索引
示例:
pk_support_ticket
fk_support_ticket_user_id
ix_support_ticket_created_at
ux_user_email
EF Core + PostgreSQL 的最佳实践
C# 实体(领域模型)
public class SupportTicket
{
public Guid Id { get; private set; }
public string Title { get; private set; }
public bool IsDeleted { get; private set; }
public DateTime CreatedAt { get; private set; }
}
数据库结构
support_ticket
id
title
is_deleted
created_at
启用自动 snake_case 映射(强烈推荐)
options.UseSnakeCaseNamingConvention();
这样你可以做到:
- 领域模型:PascalCase
- 数据库:snake_case
- 不写一行多余映射代码
这不是“风格问题”,而是成本问题
数据库命名一旦上线,修改成本极高:
- SQL
- 迁移
- 报表
- 运维脚本
- 第三方系统对接
命名规范选错一次,成本会伴随整个系统生命周期。
总结
如果你的项目满足以下任意一条:
- PostgreSQL
- 多人协作
- EF Core / ORM
- 长期维护
那么请直接采用这套规则:
snake_case + 小写 + 单数表名 + 禁止双引号
这是我们在多个实际项目中, 用时间和踩坑换来的结论。
如果你正在构建基于 PostgreSQL 的企业级系统, 越早统一命名规范,后期越省心。