「社内LT会」Prisma ORM

> ※この資料は2022年10月に社内で行ったLT会の資料をqiita slide化したものです
> ※記事の内容は間違いがあり得ますので、ご了承いただけると幸いです。内容の間違い、認識の違い、違う意見などありましたら、コメント大歓迎です！

---

今日、持ち帰って欲しいのは

**ORMに少しでもポジテイブな興味を持っていただければ！**

---
ORMご存じですか？
ご経験はありますでしょうか？

---

# ORM?

- Object-relational mapping
- データベースとオブジェクト指向プログラミング言語の間の非互換なデータを変換するプログラミング技法

---

# ORM?

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436887/3c445ccd-7371-1156-0bdf-f040b673b25a.png)

---

# ORM on Nodejs

**Prisma ORM 👈こちら使ってみました**
※その他 : TypeORM, Sequelize, Mongoose, ...

---

# 本題

- なぜ Prismaだったのか？
- なぜ ORMだったのか？(with prisma)
- Demonstration
- 実際使ってみると課題もある！
- <まとめ>それでもORMは積極的に採用する価値がある
- REFERENCE LINK

---

# なぜ Prismaだったのか？

①Openbaseにいい感じにGithub Startsがついていた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436887/608505f3-83cf-3a70-aa92-d40404a3872e.png)

---
# なぜ Prismaだったのか？

②ドキュメントが着実な印象
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436887/be35c004-29ed-d08a-ab24-4efc60c5a74c.png)

---
# なぜ Prismaだったのか？

③参考資料が多くあった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436887/f4add82c-f036-05c8-ea7f-5b2f816d7eb3.png)

---

# 大事なのは…

**なぜORMだったのか？(with PrismaORM)**

---

# なぜ ORMだったのか？(with prisma)

①DB SchemaをMigration管理したい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436887/162e9b91-d513-64b0-20cb-9f5cff2fbafd.png)

---

# なぜ ORMだったのか？(with prisma)

- ②DB定義をcode-base document化したい。
- ③Data Modelを自動生成しTyped Object化したい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436887/dec4c86d-1810-e88c-d23a-18667f275f51.png)

---

# なぜ ORMだったのか？(with prisma)​

- ④動的にQueryを書かなくていい​
    - 一元化されたDatabase Operation Interface with Prisma Model(like Repository)​
    - => ③④が繋がり、維持補修、テストがしやすい！​

https://www.prisma.io/docs/concepts/components/prisma-client/crud ​

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436887/dd29040a-8b36-c1c9-107b-c12b9e9a3712.png)

---

# Demonstration​

- Prisma Schema 作成​
- Prisma Model生成 + ERD 自動生成​
- Prisma Migrate 実行​
- Postgresql 確認​

※デモにおいては以下の資料をご参考ください。
[Start from scratch with relational databases (15 min) - Prisma](https://www.prisma.io/docs/getting-started/setup-prisma/start-from-scratch/relational-databases-typescript-postgresql)

---

# 実際使ってみると課題もある！​

- 複雑なQuery要件には要注意！（複雑な要件、性能最適化課題）​
    - ORM Libraryで提供する操作interfaceだけでは逆に複雑化されることも多い​
    - Query OptimizeもORMに任せるので、必ずしも性能がいいQuery動作をするとは保証できない​
    - 例​: 集計要件、多数のテーブル更新や他のテーブルデータ参照更新など
- データモデリングスキルが重要！（学習コスト・運用コスト）​
    - １テーブルに席にが集約せず、また不要に分けない、絶妙なラインの設計が求められる​
    - DDDアーキテクチャーと相性がいいのでおすすめ​

---

# まとめ​

**それでも​、ORMは積極的に採用する価値がある​**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436887/debd869d-ee25-7cce-5ce1-3abc03575e14.png)

---

# REFERENCE LINK

- Prisma ORM officlal​
    - https://www.prisma.io ​
- Docs​
    - [Get started, Concepts, Guides, Refereceで構成​](https://www.prisma.io/docs/​)
    - [Prisma Schema Reference​](https://www.prisma.io/docs/reference/api-reference/prisma-schema-reference​)
    - [Prisma Data Model​](https://www.prisma.io/docs/concepts/components/prisma-schema/data-model​)
    - [Prisma Migrate​](https://www.prisma.io/docs/concepts/components/prisma-migrate​)
    - [Prisma Client​](https://www.prisma.io/docs/concepts/components/prisma-client​)
- Youtube recommend​
    - [Learn Prisma In 60 Minutes](​https://www.youtube.com/watch?v=RebA5J-rlwg​)
    - [Prisma入門 - Yuuki Kanasugi | Prisma Day 2021​](https://www.youtube.com/watch?v=80CYmde9z9c​)

---

# REFERENCE LINK

- Blog
    - [次世代の Node.js ORM 、Prisma を試す](https://zenn.dev/tatsurom/articles/prisma-tutorial-from-scratch)
    - [How to Get Started with Prisma ORM for Node.js and PostgreSQL](https://blog.appsignal.com/2021/07/21/how-to-get-started-with-prisma-orm-for-nodejs-and-postgresql.html)
    - [Prisma: Node.js & TypeScript向けの完璧なORM](https://zenn.dev/kanasugi/articles/a082bd39c5bdf2)
    - [Prismaチュートリアル > Chapter 05 トランザクション (他のChapterも良い)](https://zenn.dev/thirosue/books/49a4ee418743ed/viewer/a92ccf)
    - [Node.js(Express.js)環境でPrisma ORMを使いこなすための基礎](https://reffect.co.jp/node-js/prisma-basic)
    - [Prismaでtruncateする (RawQuery使い方)](https://zenn.dev/cohky/articles/prisma-to-truncate)
    - [PrismaでのInner Joinのやりかた](https://zenn.dev/nitaking/articles/68159b441a65d2b3a07e)
    - [PrismaPromise とは何か](https://zenn.dev/dqn/articles/85c336b76d4130)
    - [Prisma チートシート](https://qiita.com/koffee0522/items/92be1826f1a150bfe62e)
    - [prismaのER図をmermaid形式で吐くには](https://zenn.dev/terrierscript/articles/2022-03-25-prisma-er-mermaid)