TypeORM:如何使用 UUID 获取下一项?

TypeORM : How to get next item using UUID?

在订单 class 中我们有一个 UUID 和其他字段:

export class Order extends BaseEntity {
    @Field()
    @PrimaryGeneratedColumn("uuid")
    id: string;

    // other fields ...

}

解析器可能是这样的:

 @Query(() => Order)
    async getNextOrder(
        @Arg("data")
        { orderId }: GetNextOrderInput,
    ) {
        return await Order.findOne(id:MoreThan(orderId);
    }

我知道不行,那么下一项怎么实现呢? UUID 是基于时间的,可以用作索引吗?

我发现 @PrimaryGeneratedColumn("uuid") 使用完全随机的 UUID v4v1 是基于时间的 here,所以没有机会在UUID v4 的基数。 @Generated("increment") 装饰器是 the doc 中提到的另一种选择 但我犯了错误,看起来 Postgres 要求 "increment" 作为主键。 所以我更喜欢使用 createdAt(of type Date)column 进行排序,并使用 LEAD 获取下一个订单的 Id:

PREPARE findNextId(uuid) AS(
    WITH producedNextIds AS(
         WITH ordersOfStore AS (
        SELECT
             "order"."id", "order"."createdAt"
         From
             "order"
         INNER JOIN "site" ON "order"."storeId" = "site"."id"
        )
        SELECT "id" , "createdAt",
            LEAD("id",1) OVER (
                ORDER BY "createdAt"
                ) next_id
        FROM
            ordersOfStore
    )
        SELECT
            "id" , "createdAt", next_id
        FROM producedNextIds
        WHERE
            "id" = ()
);
EXECUTE findNextId('cb5c5bf0-f781-46e1-9ae1-68c875bb3a56');

任何更好的解决方案将不胜感激!

我偶然发现了同样的问题。我正在使用 postgres,我想使用 UUID 作为我的主键,但我希望它们不是完全随机的。

除了实际方面,我发现 this post 提到了完全随机的 UUID 密钥如何影响数据库存储。

为了让 TypeORM 使用 uuid_generate_v1mc 而不是 UUID v4 生成 PK,我在迁移中添加了 default: 'uuid_generate_v1mc()'

await queryRunner.createTable(
  new Table({
    name: 'tags',
    columns: [
      {
        name: 'id',
        type: 'uuid',
        isPrimary: true,
        isGenerated: true,
        generationStrategy: 'uuid',
        default: 'uuid_generate_v1mc()',
      }
    ],
    // the rest of my table definition

这使得 table 创作看起来像这样:

CREATE TABLE "tags" (
  "id" uuid NOT NULL DEFAULT uuid_generate_v1mc(),
  -- rest of my table definition