メモ: ORM


オブジェクト関係マッピング

オブジェクト関係マッピング(ORM: Object Relational Mapping)とは、オブジェクト指向なブログラミング言語とリレーショナル(関係)データベースを結び付ける(マッピング)ことです。

言い換えると、DB言語ではなくサーバサイドで使用している言語を使ってリレーショナルデータベースを弄るためのツールです。(ツールの場合は OR Mapper ですね)

例えば、アプリの中で User というデータを扱う必要があった場合、アプリ側では User を表すクラス、DB 側では User テーブルを作成することになると思います。本来この DB 側のデータは SQL 文を叩いたりして編集することになると思いますが、そうではなく User クラスや user インスタンスを扱うのと同じように DB のテーブルやレコードを編集できると言ったことを実現するのが ORM の役割です。

つまり、RDB のレコード操作を、オブジェクトとして直感的に操作できる、ということです。

これの せい (おかげ)でエンジニア2年目だけど、SQL 文は滅多に書いたことがありません()

具体例

  • Sequelize
    • Node.js ⇄ MySQL, PostgreSQL, SQLite など
    • GROWI.cloud で使用
  • ActiveRecord
    • Ruby on Rails で用意されてる(?)ライブラリだそうですが、使ったことがないのでわかりません
  • Core Data
    • こちらも使ったことないですが iOS 系のアプリに用いられてるそうです

やってくれてること

  • 与えられたクラスの属性とテーブルカラムの対応付けをもとにマッピング処理
  • 与えられたマッピング定義をもとにスキーマやクラスのソースを自動生成
  • SQL を用いたデータ操作を行ってくれる API の提供

設計思想の異なるデータモデルを結びつける

ORMオブジェクト指向は「現実世界の物事に即したデータモデル」である一方で、
関係データベースは「検索やCRUDなどの処理に最適化されたデータモデル」となっている。

このような設計思想の違いを、インピーダンス・ミスマッチといい、ORM はこれを解消し、互換性をもたらしている。

ODM

MongoDB にも ORM 的な存在がいますが、MongoDB はドキュメント指向 DB なので Object Document Mapper となります。

僕が知ってるのは mongoose とかですかね

参考