Как можно сгенерировать уникальный идентификатор (ID) в TypeORM, содержащий только цифры и имеющий длину от 6 до 8 знаков?

Как можно генерировать уникальные ID в определенном формате для сущностей (Entity) при использовании TypeORM в Nest.js без создания избыточных запросов к БД?
  • 26 января 2024 г. 21:48
Ответы на вопрос 2
В TypeORM вы можете использовать свою собственную стратегию генерации ID для сущности, в том числе и шестизначный цифровой идентификатор. Одним из путей является использование декоратора `@BeforeInsert()` для генерации ID перед вставкой записи в базу данных.

Вот пример сущности с полем, которое использует пользовательскую стратегию генерации идентификатора:

```typescript
import {
  Entity,
  PrimaryGeneratedColumn,
  BeforeInsert,
  Column,
  BaseEntity,
} from 'typeorm';

@Entity()
export class MyEntity extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  customId: string;

  @BeforeInsert()
  generateCustomId() {
    // генерируем ID в диапазоне от 100000 до 99999999
    this.customId = Math.floor(
        Math.random() * (99999999 - 100000) + 100000
    ).toString();
    
    // ВАЖНО: Убедитесь, что сгенерированный ID является уникальным, здесь может потребоваться дополнительная логика,
    // например, повторное генерирование ID, если найдено совпадение в базе данных.
    // Это может потребовать выполнения дополнительного запроса к БД.
  }
}
```

Чтобы избежать излишних запросов к базе данных и удостоверится в уникальности ID, вы можете реализовать дополнительную логику, например, использовать уникальный префикс, который зависит от времени создания или других характеристик сущности.

Однако следует понимать, что любая логика проверки уникальности в конечном итоге может потребовать обращения к базе данных для гарантии того, что ID действительно уникален.

Если вам критически важно сгенерировать уникальный ID без запросов к базе данных, вам может потребоваться использовать внешнюю систему генерации идентификаторов, такую как Redis или любую другую систему, которая может предоставить уникальные числовые идентификаторы.

Также стоит учесть, что размер числового диапазона, который вы выбрали (6–8 цифр) может быть недостаточен для обеспечения уникальности в больших системах, и это может привести к большому количеству коллизий. Поэтому убедитесь в приемлемости этого диапазона для предполагаемого использования.
как вариант создать sequence в postgres: https://postgrespro.ru/docs/postgresql/9.6/sql-cre... 

установить начальное, минимальное и максимальное значение и каждый раз при вставке брать следующие значение

INSERT INTO distributors VALUES (nextval('serial'), 'nothing');
Похожие вопросы