You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 12:23:23