ORM
本格的なデータベースを使ったアプリケーションを一から作ったことがなくて、(今までブロックチェーンとかfirebaseを使ったものが多かった)色々考えている。
その中で、ORMを使うと言う判断をしたので、備忘録として概要をまとめる。
Object-relational mapping
まずはお決まりで定義から
オブジェクト指向の言語から、そうそうでない言語の橋渡しをするラッパーのようなもの
と、、すると一般的なオブジェクト思考言語とは言えないgolangにおけるそれは何になるのか?若干気になるところだ。
一番大切なのはインピーダンス・ミスマッチを解消すること。
インピーダンス・ミスマッチ
オブジェクト指向は「現実世界の物事に即したデータモデル」である一方で、 関係データベースは「検索やCRUDなどの処理に最適化されたデータモデル」となっている。
このような設計思想の違いを、インピーダンス・ミスマッチというが、これは以前のブログでも書いた通り、SQLは集合論に基づいているのでそこのミスマッチも指すと思われる。
基本的な手順は下記の通り。
- クラスの属性とテーブルカラムの対応付けを、あらかじめ外部ファイル(XMLファイルなど)で定義しておく。
- ORMフレームワークが属性とカラムのマッピングを処理する。
- マッピング定義を記述したファイルから、スキーマやクラスのソースを自動生成する。
- プログラマはORMフレームワークによって生成されたクラスと、提供されるAPIを用いてデータ操作を行う。
gorm
golangにおけるormは、gormが多い。これを使おうと思う。
- フル機能のORM(ほぼ)
- フック(作成前/作成後/保存/更新/削除/検索前/後)
- プリロード(積極的なロード)
- transaction
- 複合主キー
- SQLビルダー
- logger
- 拡張可能、GORMコールバックに基づいてプラグイン
migration
マイグレーションを実行するとテーブルが無い時は自動生成あるときはなにもしない。なので、とりあえずいつもmigrationすればいいんじゃないか、という気がしている。けど、外部ファイルにすべき?悩ましいな。
まあ、一回書いてみるしかないかなあ。