基于Drizzle、Next.js14与Neon的短随机自动生成ID字段选型咨询
最佳ID字段方案:短随机自动生成ID
针对你的需求(自动生成、随机不可预测、占用空间小),推荐两种适配Drizzle + Neon(PostgreSQL)的方案:
方案1:使用NanoID生成短随机字符串
NanoID可生成10-12位的URL安全随机字符串,长度仅为UUID的1/3左右,同时具备不可预测性。你可以在Drizzle中通过默认值函数自动生成,无需手动插入。
Drizzle Schema示例
import { pgTable, varchar } from "drizzle-orm/pg-core"; import { customAlphabet } from "nanoid"; // 自定义10位NanoID,使用URL安全字符集 const shortId = customAlphabet("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", 10); export const users = pgTable("users", { id: varchar("id", { length: 10 }) .primaryKey() .$defaultFn(() => shortId()), // 自动生成短ID name: varchar("name", { length: 255 }).notNull(), // 其他字段... });
注意事项
- 确保在Next.js项目中安装
nanoid依赖:npm install nanoid - 10位长度的NanoID碰撞概率极低,完全满足大多数业务场景需求。
方案2:数据库层面生成短随机ID(PostgreSQL + pgcrypto)
如果希望完全在数据库侧处理ID生成,可以利用Neon支持的pgcrypto扩展生成短随机字符串,避免应用层依赖。
步骤1:启用pgcrypto扩展
在Neon控制台执行SQL:
CREATE EXTENSION IF NOT EXISTS pgcrypto;
步骤2:Drizzle Schema示例
import { pgTable, varchar, sql } from "drizzle-orm/pg-core"; export const posts = pgTable("posts", { id: varchar("id", { length: 10 }) .primaryKey() .default(sql`encode(gen_random_bytes(5), 'base64url')`), // 生成10位URL安全随机ID title: varchar("title", { length: 255 }).notNull(), // 其他字段... });
gen_random_bytes(5)生成5字节随机数据,转成base64url后正好是10个字符,比UUID节省大量存储空间。
为什么不选其他类型?
- Serial/BigSerial:自增ID可预测,存在枚举攻击风险,不符合你的安全需求。
- UUID:16字节/36字符,占用空间大,查询性能略低于短字符串ID。
- Text类型:需要手动生成ID,不符合自动生成的需求。
内容的提问来源于stack exchange,提问作者RaihanShezan
相关产品推荐
相关产品推荐

