Vai al contenuto principale

Indici

Traduzione Beta Non Ufficiale

Questa pagina è stata tradotta da PageTurner AI (beta). Non ufficialmente approvata dal progetto. Hai trovato un errore? Segnala problema →

Indici su singola colonna

Puoi creare un indice del database per una colonna specifica usando @Index sulla colonna desiderata. Puoi creare indici per qualsiasi colonna della tua entità. Esempio:

import { Entity, PrimaryGeneratedColumn, Column, Index } from "typeorm"

@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number

@Index()
@Column()
firstName: string

@Column()
@Index()
lastName: string
}

Puoi anche specificare un nome per l'indice:

import { Entity, PrimaryGeneratedColumn, Column, Index } from "typeorm"

@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number

@Index("name1-idx")
@Column()
firstName: string

@Column()
@Index("name2-idx")
lastName: string
}

Indici univoci

Per creare un indice univoco, specifica { unique: true } nelle opzioni dell'indice:

Nota: CockroachDB memorizza gli indici univoci come vincoli UNIQUE

import { Entity, PrimaryGeneratedColumn, Column, Index } from "typeorm"

@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number

@Index({ unique: true })
@Column()
firstName: string

@Column()
@Index({ unique: true })
lastName: string
}

Indici su più colonne

Per creare un indice su più colonne, posiziona @Index sull'entità stessa e specifica tutti i nomi delle proprietà delle colonne da includere nell'indice. Esempio:

import { Entity, PrimaryGeneratedColumn, Column, Index } from "typeorm"

@Entity()
@Index(["firstName", "lastName"])
@Index(["firstName", "middleName", "lastName"], { unique: true })
export class User {
@PrimaryGeneratedColumn()
id: number

@Column()
firstName: string

@Column()
middleName: string

@Column()
lastName: string
}

Indici spaziali

MySQL, CockroachDB e PostgreSQL (con PostGIS installato) supportano indici spaziali.

Per creare un indice spaziale su una colonna in MySQL, aggiungi Index con spatial: true a una colonna che utilizza un tipo spaziale (geometry, point, linestring, polygon, multipoint, multilinestring, multipolygon, geometrycollection):

@Entity()
export class Thing {
@Column("point")
@Index({ spatial: true })
point: string
}

Per creare un indice spaziale su una colonna, aggiungi Index con spatial: true a una colonna che utilizza un tipo spaziale (geometry, geography):

export interface Geometry {
type: "Point"
coordinates: [Number, Number]
}

@Entity()
export class Thing {
@Column("geometry", {
spatialFeatureType: "Point",
srid: 4326,
})
@Index({ spatial: true })
point: Geometry
}

Creazione concorrente

Per evitare di acquisire un lock ACCESS EXCLUSIVE durante la creazione/rimozione di indici in Postgres, puoi utilizzare il modificatore CONCURRENTLY. Per usare l'opzione concorrente, imposta migrationsTransactionMode: none nelle opzioni della tua data source.

TypeORM supporta la generazione di SQL con questa opzione quando l'opzione concurrent è specificata sull'indice.

@Index(["firstName", "middleName", "lastName"], { concurrent: true })

Per maggiori informazioni consulta la documentazione di Postgres.

Tipo di indice

Se devi specificare un tipo personalizzato per l'indice, puoi utilizzare la proprietà type. Se la proprietà spatial è impostata, questo campo verrà ignorato.

@Index({ type: 'hash' })

Questa funzionalità è attualmente supportata solo per PostgreSQL.

Disabilitazione della sincronizzazione

TypeORM non supporta alcune opzioni e definizioni di indici (es. lower, pg_trgm) a causa delle differenze specifiche dei database e di problemi nella raccolta automatica delle informazioni sugli indici esistenti. In questi casi dovresti creare l'indice manualmente (ad esempio nelle migrazioni) con qualsiasi firma desiderata. Per far ignorare a TypeORM questi indici durante la sincronizzazione, usa l'opzione synchronize: false nel decoratore @Index.

Ad esempio, crei un indice con confronto case-insensitive:

CREATE INDEX "POST_NAME_INDEX" ON "post" (lower("name"))

successivamente, dovresti disabilitare la sincronizzazione per questo indice per evitare l'eliminazione nella prossima sincronizzazione dello schema:

@Entity()
@Index("POST_NAME_INDEX", { synchronize: false })
export class Post {
@PrimaryGeneratedColumn()
id: number

@Column()
name: string
}