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スキーマに含まれることを確認したい場合。