id 字段推荐的列类型

问题描述 投票:0回答:1

我正在使用 Drizzle、Next.js 14 应用程序路由器和 Neon 无服务器。表中 id 字段的最佳列类型是什么?我认为自动生成、随机但不是很大(如 UUID)的解决方案是最好的。

大多数教程都显示文本或序列类型。但文本不会自动设置 Id,因此我无法在不提供 id 字段的情况下使用插入。序列号是自动递增的,但我读到这对安全性不利(id 是可预测的)。 UUID 是另一种选择,但它们占用大量空间并且还有其他缺点。那么我应该使用哪一个呢?如果您能分享一个简短的例子来回答您的问题,我会很高兴。我需要随机短自动生成 ID 字段。

next.js database-design pg drizzle
1个回答
1
投票

我也遇到了同样的问题。

我现在所做的是将每个表的插入次数保存在一个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 时继续重新启动。

我希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.