Active Record(アクティブ・レコード)とは
Active Recordは、
企業アプリケーションでよく見られるデザインパターンの一つで、
データベースとオブジェクト指向プログラミングの間を橋渡しする役割を果たします。具体的には、
データベースのテーブルやビューの各行を、オブジェクトとして表現し、操作することを可能にします。
概要
Active Recordの基本的な考え方は、
データベースのテーブルやビューの一行を、対応するクラスのインスタンスとして扱うというものです。これにより、
データベースのレコードとオブジェクトが密接に結びつき、オブジェクトを通じてデータの読み書きを行うことができます。
このクラスは、
データベースアクセスを
カプセル化し、オブジェクトの生成時には、新しい行を
データベースに追加する「保存」メソッドが利用されます。また、オブジェクトの属性が変更された際には、
データベースの対応する行も更新されます。さらに、ラッパークラスは、テーブルやビューのカラムに対応するアクセサメソッドを提供し、それ以外にも、MVCモデルにおけるビジネスロジックを記述することができます。
Active Recordの大きな特徴は、テーブルとクラスが一対一で対応するため、構造が非常にシンプルになる点です。特に
Ruby on Railsでは、
データベースの定義からほぼ自動的にCRUD操作(Create, Read, Update, Delete)を備えたクラスが生成されるため、開発効率が向上します。しかし、この特性から、複雑な
データベース設計には不向きな面もあります。
具体例
Active Recordの実装として広く知られているのが、
Ruby on Railsにおける実装です。例として、`parts`テーブルが`id`列(シリアルな主キー)、`name`列(varchar型)、`price`列(money型またはdouble型)を持つ場合を考えてみましょう。
新しいレコードを作成する際には、以下のようなコードが利用できます。
ruby
part = Part.new(name: 'widget', price: 12.34)
part.save
このコードは、指定された値を持つ新しい行を
データベースに作成します。これは、以下の
SQLコマンドとほぼ同じ意味を持ちます。
sql
INSERT INTO parts (name, price) VALUES ('widget', 12.34);
また、
データベースからレコードを検索する場合は、次のように記述できます。
ruby
part = Part.find_by(name: widgetname)
このコードは、`name`列が
Rubyの変数`widgetname`の値と一致する最初の行を取得し、オブジェクトを生成します。これは、以下の
SQLコマンドと同義ですが、
Rubyのコードには
SQLが直接記述されることはありません。
sql
SELECT
FROM parts WHERE name = 'widgetname' LIMIT 1;
さらに、上記のコードはより簡潔に記述することも可能です。
ruby
part = Part.find_by_name(widgetname)
補足
Active Recordは、データベースの操作をオブジェクト指向的に行える便利なパターンですが、複雑なデータベース設計や、オブジェクトとデータベースの関係が複雑になる場合には、別のパターンを検討する必要があるかもしれません。
関連項目
データマッパーパターン: Active Recordではオブジェクト自体が永続化処理を担当するのに対し、データマッパーではオブジェクトをデータマッパーに渡し、永続化処理を行います。
[オブジェクト関係マッピング]: オブジェクトとデータベースの間のデータ変換を行う技術全般を指します。
メッセージ転送: オブジェクト間でメッセージをやり取りすることで、処理を分散させるパターン。
外部リンク
*
TECHSCORE - デザインパターンから見たActive Record