ORM

本格的なデータベースを使ったアプリケーションを一から作ったことがなくて、(今までブロックチェーンとかfirebaseを使ったものが多かった)色々考えている。

その中で、ORMを使うと言う判断をしたので、備忘録として概要をまとめる。

Object-relational mapping

まずはお決まりで定義から

オブジェクト指向の言語から、そうそうでない言語の橋渡しをするラッパーのようなもの

と、、すると一般的なオブジェクト思考言語とは言えないgolangにおけるそれは何になるのか?若干気になるところだ。

一番大切なのはインピーダンス・ミスマッチを解消すること。

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

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

このような設計思想の違いを、インピーダンス・ミスマッチというが、これは以前のブログでも書いた通り、SQLは集合論に基づいているのでそこのミスマッチも指すと思われる。

基本的な手順は下記の通り。

  1. クラスの属性とテーブルカラムの対応付けを、あらかじめ外部ファイル(XMLファイルなど)で定義しておく。
  2. ORMフレームワークが属性とカラムのマッピングを処理する。
  3. マッピング定義を記述したファイルから、スキーマやクラスのソースを自動生成する。
  4. プログラマはORMフレームワークによって生成されたクラスと、提供されるAPIを用いてデータ操作を行う。

gorm

golangにおけるormは、gormが多い。これを使おうと思う。

  • フル機能のORM(ほぼ)
  • フック(作成前/作成後/保存/更新/削除/検索前/後)
  • プリロード(積極的なロード)
  • transaction
  • 複合主キー
  • SQLビルダー
  • logger
  • 拡張可能、GORMコールバックに基づいてプラグイン

migration

マイグレーションを実行するとテーブルが無い時は自動生成あるときはなにもしない。なので、とりあえずいつもmigrationすればいいんじゃないか、という気がしている。けど、外部ファイルにすべき?悩ましいな。

まあ、一回書いてみるしかないかなあ。