Prismaのリレーション設定

Prismaのリレーション設定

投稿日: 2024年12月22日

学習振り返り
Tips
要約
  • リレーションとはデータベースのテーブル間の関係を定義し、関連データを取得するために使用される。
  • 双方向のリレーションを設定することで、モデル間のデータを双方向からアクセス可能にする。
  • 正しくリレーションを設定することで、データベース設計が直感的になり、アプリケーションのデータ操作が容易になる。

はじめに

今回は、課題10、11、オリジナルアプリ制作で必要な内容となっています!
DB設計にも活きる知識になりますので、よかったら読んでやってください笑

リレーション

リレーションとは、データベースのテーブル間の関係を「リレーション」(DB設計おける外部キーと同じ)としてモデル(DB設計で言うとテーブルに相当する)を定義します。
これにより、関係するデータを取得することができます!
リレーションは、@relation属性を使って設定されます。


例: ContactモデルとUsersモデルの関係

user_idフィールドがUsersモデルidフィールドを参照する外部キーとして機能します。
  @relation(fields: [user_id], references: [id])を使用して、`user_id`が`Users`モデルの`id`を参照することを示しています。

prisma

model Users {
  id                  Int               @id @default(autoincrement())
  created_at          DateTime          @default(now())
  updated_at          DateTime          @updatedAt
  username            String
  profileIcon         String
  biography           String            @db.Text
  cafes               Cafe[]
  contacts            Contact[]
  information         Information[]
  favorites           Favorite[]             
}

model Contact {
   id                 Int              @id @default(autoincrement())
  created_at          DateTime         @default(now())
  updated_at          DateTime         @updatedAt
  user_id             Int              @unique
  contact_content     tring            @db.Text
  users               Users            @relation(fields: [user_id], references: [id])    
}

双方向のリレーション

双方向のリレーションとは、リレーション設定する際、関連する両方のモデルにリレーションフィールド(外部キーがある列)を持たせる必要があります!
これにより、モデル間のデータを双方向からアクセスできるようになります!
フィールドは配列型(`[]`)として定義されます。
これにより、一対多の関係を表現することができます。

例: InformationモデルとCafeモデルの双方向リレーション
Informationモデル
cafeフィールドが`Cafe`モデルを参照します。

Cafeモデル
informationフィールドがInformationモデルのリストを保持します。
これは、1つのカフェが複数の情報(`Information`)を持つことができることを示しています。

model Information {
  id                      Int               @id @default(autoincrement())
  created_at              DateTime          @default(now())
  updated_at              DateTime          @updatedAt
  is_suggested            Boolean           
  latest_info             String 
  time_elapsed            String            @db.VarChar(50)
  recommended_cafe        String
  recommendation_reason   String            @db.Text
  user_id                 Int
  cafe_id                 Int              
  user                    Users             @relation(fields: [user_id], references: [id])
  cafe                    Cafe              @relation(fields: [cafe_id], references: [id])
}


model Cafe {
  id                      Int               @id @default(autoincrement())
  created_at              DateTime          @default(now())
  updated_at              DateTime          @updatedAt
  cafe_name               String            @db.VarChar(100)
  thumbnail_image         String            @db.VarChar(255) 
  area                    String  
  opening_time            String            @db.VarChar(5)
  closing_hours           String            @db.VarChar(5)
  closing_days            String
  cafe_url                String            @db.VarChar(255)
  wifi_available          Boolean
  wifi_speed              Boolean
  wifi_stability          Boolean
  power_outlets           Boolean
  seat_availability       Boolean
  star_rating             Int               
  comment                 String
  locationCoordinates     String
  user_id                 Int
  information             Information[]//Cafeが持つInformationのリスト
  favorites               Favorite[]
  users                   Users             @relation(fields: [user_id], references: [id])
}

まとめ

リレーション設定することで、Prismaを使用してモデル間のデータを効率的に操作できます。
リレーションを正しく設定することで、データベース設計がより直感的なり、アプリケーションのデータ操作が容易になる。

シェア!

Threads
Loading...
記事一覧に戻る
Threads
0