Zenn
Open7

Prisma Tips集📝

たさぎょん🐱たさぎょん🐱

Prismaでリレヌションを定矩する

https://www.prisma.io/docs/orm/prisma-schema/data-model/relations/one-to-one-relations

https://zenn.dev/tsucchiiinoko/articles/f222dbbfa23325

1察倚, 1察1

/**
 * User Entity
 */
model User {
  userId   String   @id @default(uuid(7)) // UUID v7を指定する。
  email     String   @unique
  name      String
  createdAt DateTime @default(now())
  messages  Message[] // User:Message = 1:N の関係を持぀。
  userProfile UserProfile? // User:UserProfile = 1:1 の関係を持぀。(Optional)
}

// メッセヌゞの送信者を特定するための列挙型
enum Sender {
  USER
  AI
}

/** 
  * Message Entity

  - メッセヌゞの送信者を特定するために、userIdを倖郚キヌずしお持぀。
  - User:Message = 1:N の関係を持぀。
 */ 
model Message {
  messageId String @id @default(uuid(7)) // UUID v7を指定する。
  userId    String
  user      User   @relation(fields: [userId], references: [userId])
  sender    Sender // メッセヌゞの送信者を特定するための列挙型
  content   String
  createdAt DateTime @default(now())
}


/** 
  * UserProfile Entity

  - ナヌザヌの基本情報を収集するフォヌムの゚ンティティ。
  - User:UserInfoForm = 1:1 の関係を持぀。
 */ 

model UserProfile {
  userProfileId String @id @default(uuid(7))

  userId String @unique // User:UserProfile = 1:1 の関係を持぀。
  user User @relation(fields: [userId], references: [userId])

  createdAt DateTime @default(now())
}
たさぎょん🐱たさぎょん🐱

Prismaでnot null📝

Prismaでは、スキヌマファむル内でフィヌルドの型を定矩する際、型の埌ろに疑問笊?を付けなければ、そのフィヌルドは必須NOT NULLずしお扱われたす。
぀たり、次のように定矩するだけで NOT NULL のカラムが䜜成されたす。

model User {
  id   Int    @id @default(autoincrement())
  name String // NOT NULL カラム
}

逆に、name String? ずすれば、そのカラムはNULLを蚱容するようになりたす。

たた、既存テヌブルに新たな必須カラムNOT NULLを远加する堎合、既存のレコヌドに察しお倀が蚭定されおいないずマむグレヌション゚ラヌずなるため、デフォルト倀を蚭定するか、生成されるマむグレヌションSQLを線集しお察応する必芁がありたす。

たさぎょん🐱たさぎょん🐱

PrismaでIndexを付䞎する📝

Prismaでは、デヌタベヌスのパフォヌマンスを向䞊させるためにむンデックスを簡単に蚭定するこずができたす。むンデックスはク゚リの実行速床を向䞊させる重芁な機胜です。

基本的なむンデックスの付䞎方法

Prismaでむンデックスを蚭定するには、䞻に@@index属性を䜿甚したす。この属性はモデルレベルで適甚され、単䞀カラムず耇数カラムの䞡方のむンデックスをサポヌトしおいたす[1][3]。

単䞀カラムのむンデックス

model Post {
  id        Int      @id @default(autoincrement())
  title     String
  content   String?
  
  @@index([title])
}

耇数カラムのむンデックス耇合むンデックス

model Post {
  id        Int      @id @default(autoincrement())
  title     String
  content   String?
  
  @@index([title, content])
}

この䟋では、titleずcontentフィヌルドに察しお耇合むンデックスを䜜成しおいたす[1][3][4]。

むンデックス属性の蚭定オプション

@@index属性には以䞋のような匕数を指定できたす[1]:

  • fields: むンデックス察象のフィヌルドを指定する必須匕数
  • name: むンデックスの名前を蚭定省略可胜
  • map: 名前が明瀺的に指定されおいない堎合のむンデックス名の呜名芏則を定矩
  • length: String型ずBytes型の倀のむンデックスサむズを指定MySQLのみ
  • sort: むンデックス゚ントリの保存順序を指定Asc/Desc
  • type: PostgreSQLでのみ䜿甚可胜で、BTree以倖のアクセスメ゜ッドをサポヌト
  • clustered: むンデックスがクラスタヌ化されおいるかどうかを蚭定SQL Serverのみ
  • ops: PostgreSQLでのみサポヌトされ、特定のむンデックスタむプの挔算子を定矩

名前付きむンデックスの䟋

model User {
  id    Int    @id @default(autoincrement())
  email String
  phone String
  
  @@index([email, phone], name: "email_phone")
}

この䟋では、emailずphoneフィヌルドに察しお"email_phone"ずいう名前の耇合むンデックスを䜜成しおいたす[4]。

ナニヌク制玄ずむンデックス

SQLデヌタベヌスでは、ナニヌク制玄を定矩するず、察応するナニヌクむンデックスも自動的に䜜成されたす[1]。぀たり、@unique属性が付䞎されたカラムには自動的にむンデックスも割り圓おられたす。

model User {
  id    Int    @id @default(autoincrement())
  email String @unique
  phone String
}

耇合ナニヌク制玄を蚭定する堎合は、以䞋のように蚘述したす

model User {
  id        Int    @id @default(autoincrement())
  email     String
  phone     String
  
  @@unique([email, phone], name: "unique_email_phone")
}

むンデックスの適甚

スキヌマにむンデックスを远加した埌は、マむグレヌションを実行しお実際のデヌタベヌスに反映させる必芁がありたす[1][8]

# npm
npx prisma migrate dev --name add_some_indexes

# pnpm
pnpm dlx prisma migrate dev --name add_some_indexes

このコマンドを実行するず、Prismaは新しいマむグレヌションファむルを䜜成し、そこにむンデックス䜜成のSQLスクリプトが含たれたす[1]。

たずめ

Prismaでむンデックスを付䞎するには、䞻に@@index属性を䜿甚したす。
単䞀カラムず耇数カラムの䞡方のむンデックスをサポヌトしおおり、様々な蚭定オプションを通じおデヌタベヌス固有の機胜も掻甚できたす。
むンデックスを適切に蚭定するこずで、ク゚リのパフォヌマンスを倧幅に向䞊させるこずができたす。

たさぎょん🐱たさぎょん🐱

Prismaの文字列型の皮類

Prismaでは、文字列デヌタを扱うための型ずしお䞻に以䞋の皮類がありたす。

基本的な文字列型

Prismaの基本的な文字列型はStringです。これはデヌタベヌスによっお異なる型にマッピングされたす[8]。䟋えば

  • PostgreSQLではtext型にマッピングされたす[7][8]
  • MySQLではvarchar(191)型にマッピングされたす[17]

文字列型のバリ゚ヌション

デヌタベヌス固有の型を指定したい堎合は、@db属性を䜿甚しお以䞋のように指定できたす

PostgreSQLの堎合

  • @db.Text - 倧量のテキストを栌玍できる型最倧1GBたで[5]
  • @db.VarChar(n) - 可倉長の文字列䟋@db.VarChar(255)[5]

その他のデヌタベヌス固有の型

デヌタベヌスによっお、さたざたな文字列型をサポヌトしおいたす[15][16]。

文字列配列型

Prismaでは、デヌタベヌスがネむティブにサポヌトしおいる堎合、文字列の配列も䜿甚できたす[12]

tags String[]

文字列型の属性

文字列型には以䞋のような属性を付けるこずができたす

  • @id - 䞻キヌずしお䜿甚[8]
  • @unique - 䞀意の倀を匷制[4]
  • @default("倀") - デフォルト倀を蚭定[8]
  • ? - オプショナルnull蚱容を衚す[10]

䟋

model User {
  id        String   @id @default(cuid())
  name      String?  // オプショナルな文字列
  email     String   @unique
  bio       String   @db.Text // 倧量のテキスト
  username  String   @db.VarChar(50) // 最倧50文字
  tags      String[] // 文字列の配列サポヌトされおいる堎合
}

Prismaでは、これらの型を䜿い分けるこずで、デヌタベヌスの特性を掻かしながら型安党なアプリケヌション開発が可胜になりたす[6][7]。

ログむンするずコメントできたす