1. ホーム
  2. 記事一覧
  3. ORMのメリットやユースケース

2023.03.28

ORMのメリットやユースケース

オブジェクト関係マッピングORMObject-Relational Mapping)とは、オブジェクト指向プログラミング言語とデータベースを結びつけるための技術です。関係データベース(RDB)のデータをオブジェクトとしてプログラムから直感的に扱えるようにし、データベース操作に関する処理の記述の煩雑さを軽減してより柔軟にアプリケーションを構築することを可能にします。ORMが登場した背景は、オブジェクト指向と関係データベースの考え方の違い(インピーダンス・ミスマッチ)を解消するためでした。

インピーダンス・ミスマッチとは

オブジェクト指向は現実世界の物事に即してデータモデルを定義している一方で、関係データベースはCRUD処理などデータベース操作に最適化してデータモデルを定義しています。これらの設計方針を混在させてしまうと、無理な表結合や複数テーブルにまたがる更新処理が多く発生してパフォーマンスが悪化するなどの不都合を招きます。

このようなデータモデルの設計思想の違いから生じる問題を「インピーダンス・ミスマッチ」と呼びます。

ORM以前の問題

ORMは名前の通り、「オブジェクト」と「関係データベース」をマッピング=対応付けするフレームワークと言えます。ORMフレームワークがない場合、マッピングをプログラマー自身が行わなければなりません。インピーダンス・ミスマッチが生じる「オブジェクト」と「関係データベース」をマッピングするコードを記述する作業は、非常に煩雑でありながら単調なコードの繰り返しである場合が多く気づきにくいバグが生じる危険性があります。

また、非オブジェクト指向言語であるSQLを意識しながらオブジェクト指向プログラムを書くことで、オブジェクト指向の柔軟性が損なわれる問題もあります。さらに、オブジェクトからデータを取り出してSQLに構築し直す作業も煩雑です。カラムに変更が生じた場合は、再びRDBにアクセスしてコードを修正する必要があります。

さらに、開発・運用の最中にRDBを移行することになればRDBMSの製品によるSQL文法の違いを一つ一つ確認・修正しなければなりません。

ORMのメリット

こうした問題を解決するために、ORMフレームワークが開発されました。ORMを使用することで、RDBにアクセスするプログラムをスマートに記述することができます。プログラマーはSQLを意識せずにデータを扱うことができ、ORMフレームワークがマッピング作業を行ってくれます。これにより、プログラマーはより柔軟で効率的なプログラミングを行うことができます。

またORMを使用するとSQLを直接記述せずにプログラミング言語でRDBを操作するコードを記述します。つまりRDBMSによるSQL文法の違いを吸収できるため、どのRDBMSでも同じように動作する点もORMのメリットと言えるでしょう。

ORMによるマッピング処理について

ORMによるマッピング処理は以下の流れで行われます。

  1. あらかじめ、クラスの属性とテーブルカラムの対応付け(Mapping)をXMLファイルなどの外部ファイルで定義する
  2. ORMフレームワークが外部ファイルで定義したクラスの属性とテーブルカラムのマッピングを処理する
  3. ORMフレームワークによって生成されたクラスを用いて、フレームワークの提供するAPIを用いてデータの保存や検索などの処理を記述する

ORMライブラリを利用したユースケース

プログラミング言語にはいくつかのORMライブラリが提供されています。中には各プログラミング言語のフレームワークに搭載されているものもあります。以下はORMライブラリの一例です。

ORM言語webフレームワーク
SQLAlchemyPython
DjangoORMPythonDjango
IdiormPHP
EloquentPHPLaravel
ActiveRecordRubyRuby on Rails
TypeORMTypeScript
JavaScript
SequelizeNode.js

SQLAlchemy

SQLAlchemyPythonプログラムのためのORMで最もメジャーなライブラリです。SQLAlchemyには以下のような代表的な機能があります。

  • データベースへの接続、SQLクエリの実行
  • メタデータ
  • ORM

特にメタデータはSQLAlchemyの中でも強力な機能で、Pythonコードとテーブルを完全に同期させることが可能です。テーブルの変更をコードに、コードの変更をテーブルに適用することができ、開発中のマイグレーションの手間を省力化することができます。

またSQLAlchemyがサポートするRDBMSには以下が挙げられます。

  • Microsoft SQL Server
  • MySQL / MariaDB
  • Oracle
  • PostgreSQL
  • SQLite

SQLAlchemyの操作例

SQLAlchemyを用いて、生徒を管理するstudentsテーブルを作成し、これがStudentsクラスと対応付けられている場合の操作例を以下に示します。こちらの例ではSQLiteを使用します。 ※詳しい記述方法・ルールは省略します。(参考:公式ドキュメント

  1. データベースとの接続を確立、モデルを定義してテーブルを作成する
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

# データベースに接続するためのエンジンを作成
engine = create_engine('sqlite:/// students.db', echo=True)
Base = declarative_base()

# Studentsクラスを定義
class  Students(Base):
    __tablename__ = 'students'
    id = Column(Integer, primary_key=True)
    name = Column(String)
    club = Column(String)

# テーブルを作成する
Base.metadata.create_all(engine)

# データベースに接続・操作を行うためのセッションを作成する
Session = sessionmaker(bind=engine)
session = Session()
  1. データを取得・表示する
# id = 1 のレコードを取得する
student = session.query(Students).filter_by(id=1).first()

# 取得したレコードのnameを表示する
print(student.name)  # Student1 name
  1. データを更新する
# 取得したレコードのclubを変更する
student.club = "New Club"
session.commit()
  1. データを追加する
# データを追加する
new_student = Students(name="Alice", club="テニス")
session.add(new_student)
session.commit()

このように、SQLを用いずにpythonプログラムからデータベース操作を行うことができます。

まとめ

オブジェクト指向プログラミング言語にはいくつかのORMライブラリが存在します。ORMはシステム構築では欠かせないデータベース操作を直感的に記述することができ、テーブルとソースコードの同期管理やRDBMSによるSQL文法の差異吸収などマッピング処理以外の利点も機能として備わっています。

しかしORMだけでプログラムからデータベース操作ができてしまうためプログラマーがSQLを書く・学ぶ機会が減ることが懸念されます。SQLはRDBを扱うために最適な言語でありRDBアクセスを行うシステムを構築する上では必要不可欠です。双方を理解してORMを利用することで、より柔軟にシステムを構築できるでしょう。

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事