我正在使用 Drizzle、Next.js 14 应用程序路由器和 Neon 无服务器。表中 id 字段的最佳列类型是什么?我认为自动生成、随机但不是很大(如 UUID)的解决方案是最好的。
大多数教程都显示文本或序列类型。但文本不会自动设置 Id,因此我无法在不提供 id 字段的情况下使用插入。序列号是自动递增的,但我读到这对安全性不利(id 是可预测的)。 UUID 是另一种选择,但它们占用大量空间并且还有其他缺点。那么我应该使用哪一个呢?如果您能分享一个简短的例子来回答您的问题,我会很高兴。我需要随机短自动生成 ID 字段。
我也遇到了同样的问题。
我现在所做的是将每个表的插入次数保存在一个json文件中。
从 json 文件中读取此数字,并用任意长度的随机字符串(根据需要)填充它,这会返回一个对于每个表来说都是唯一的字符串。
这是tables.json
//table.json
{
"users": 0,
"sections": 0,
"purchases": 0,
"orders": 2,
"payments": 0,
}
这是createId模块
// createId
import jsonfile from "jsonfile";
import path from "path";
const file = path.join(__dirname, "tables.json"); //get the tables.json file path
export const createId = (table: string): string => {
let tables = jsonfile.readFileSync(file);
const tableId = tables[table] + 1;
tables[table] = tableId;
jsonfile.writeFile(file, tables, (err) => {
if (err) {
console.log(err);
}
});
const chars = "abcdefghijklmnopqrstuvwxyz0123456789";
const salt = shuffle(chars, 2, 5); //you can create this function to get any random string of any length as you want. Here, my shuffle is getting a random string of length between 2 and 5. just to add some extra unpredictability to it
return tableId + salt;
}
这是毛毛雨模式。 记下 createId 参数。 ('orders') 引用tables.json中的表名,它将读取最后一个递增的id,向其添加1并将其写回tables.json文件。您可能决定对 json 文件使用同步读写。但这目前正在满足我的目的。
import { createId } from '../schemas/create-id.ts
export const orders = pgTable("orders", {
id: varchar("id", { length: 128 }).$defaultFn(() => createId("orders")).primaryKey(),
......
})
如果您使用的是nodemon,请记住使用nodemon --ignore 标志来忽略tables.json 文件。否则,nodemon 将在每次写入tables.json 时继续重新启动。
我希望有帮助。