Drizzle ORMにおける複合インデックス

複数カラムのSQL CREATE INDEX文をDrizzle ORMのテーブル定義の第3引数にあるindex()制約に変換します。

Best Practices

詳細な説明

Drizzleにおける複合インデックス

複合インデックスは複数のカラムにまたがり、クエリパフォーマンスに不可欠です。コンバーターはSQL CREATE INDEX文をテーブルの制約コールバック内のDrizzleのindex()関数にマッピングします。

基本的な複合インデックス

SQL:

CREATE TABLE orders (
  id SERIAL PRIMARY KEY,
  customer_id INTEGER NOT NULL,
  status VARCHAR(20) NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_orders_customer_status ON orders(customer_id, status);

Drizzle:

import { index, integer, pgTable, serial, timestamp, varchar } from "drizzle-orm/pg-core";
import { sql } from "drizzle-orm";

export const orders = pgTable("orders", {
  id: serial("id").primaryKey(),
  customerId: integer("customer_id").notNull(),
  status: varchar("status", { length: 20 }).notNull(),
  createdAt: timestamp("created_at").default(sql`CURRENT_TIMESTAMP`),
}, (table) => [
  index("idx_orders_customer_status").on(table.customerId, table.status),
]);

1つのテーブルに複数のインデックス

テーブルは複数のインデックスを持つことができます。すべて同じ制約コールバックに入ります:

CREATE INDEX idx_orders_customer ON orders(customer_id);
CREATE INDEX idx_orders_status ON orders(status);
CREATE INDEX idx_orders_created ON orders(created_at);
export const orders = pgTable("orders", {
  // ... カラム
}, (table) => [
  index("idx_orders_customer").on(table.customerId),
  index("idx_orders_status").on(table.status),
  index("idx_orders_created").on(table.createdAt),
]);

制約の混在

制約コールバックには異なるタイプの制約を一緒に含めることができます:

export const teamMembers = pgTable("team_members", {
  teamId: integer("team_id").notNull(),
  userId: integer("user_id").notNull(),
  role: varchar("role", { length: 50 }),
  joinedAt: timestamp("joined_at"),
}, (table) => [
  primaryKey({ columns: [table.teamId, table.userId] }),
  unique().on(table.teamId, table.role),
  index("idx_team_joined").on(table.teamId, table.joinedAt),
]);

インデックス命名規約

良いインデックス命名はデータベースの保守に役立ちます。一般的な規約:

  • idx_{table}_{columns} — 例:idx_orders_customer_status
  • {table}_{columns}_idx — 例:orders_customer_status_idx

コンバーターは利用可能な場合、SQLから元のインデックス名を保持します。

部分インデックスと式インデックス

PostgreSQLは部分インデックス(WHERE句)と式インデックスをサポートしています。これらはDrizzleのスキーマDSLでは直接サポートされておらず、生のSQLマイグレーションが必要です。コンバーターは標準的なインデックス定義のみを処理します。

ユースケース

マルチカラムクエリを最適化するための複合インデックスがデータベースにあり、変換時に失われるのではなくDrizzle ORMスキーマに含まれることを確認したい場合。

試してみる — SQL to Drizzle Schema

フルツールを開く