0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

各言語のORMあれこれメモ

Posted at

Ruby

  • ActiveRecordほぼ一択
  • MySQLとPostgresとSQLiteを横断して使えるし、実際にきれいに横断して使われてる

PHP

  • mysql_ 関数を直でいじる長い歴史
  • PDOを直で触る長い歴史
  • Eloquent ORM (Laravel同梱のORM)
  • CakePHP ORM
  • Zend DB

Python

  • Django ORM (Webフレームワークではこっちがメジャー)
  • SQLAlchemy (ORM単品ではこっちがメジャー)
  • そもそもデータ分析では一旦DataFrameにして列指向で集計すると行単位で操作するRDBの世界とは離れる

Java

  • JDBC直書きの長い歴史(& Oracle依存のSQL使いまくり)
  • Spring JDBC
  • JPA
  • S2JDBC(Seasar2のORM)

大事なポイントは、「言うほど一つのプロジェクトでDBMSを変えることなどない」というところ。

PHPはMySQLべったりなコードは多い。Java(というか業務系の現場)ではOracleべったりなコードは多い。
当然のことながらちょっとしたラッパーは作るから「独自ORM」というのが正確か。
べったりというと「移植性が悪い」というマイナスポイントはあるが、DBの性能を最大限に活かそうとするとそうなる。

例えば、MySQL専用で書くなら以下の機能が便利。

  • limitで絞ってもヒットした全体の件数を返す機能(FOUND_ROWS)
  • SQLでoffsetしなくてもseekで移動する機能

Oracleでは以下の機能が便利だったりする

  • ROWIDを使った最速のキーダイレクトなアクセス
  • シーケンスを使った採番
  • NULLと空文字列を同一扱いできちゃう

DBMSが持つ機能をフルに活かす(もしくは意識せず使っちゃう)ことで、DBMSの依存ってのは起こりうる。

逆にRailsがかなり特殊。

  • お勉強フェーズではSQLite
  • 本家はPostgres
  • 実際にはMySQLに繋げてる人もかなり多い

と見事にDBMSに依存せずに書いてる。

その代わりDMBS側でやってほしいことをフレームワーク側で肩代わりしてる。

  • 絶対に主キーは必要(ROWIDに依存したくないから)
  • デフォルトでは主キーはオートインクリメント
  • デフォルトのページングはoffsetではなくidのカーソルベースでのページング
  • そんな制約もあって複合主キーは認めない
  • lock_versionというカラムを作っておくと勝手に楽観的ロックしてくれる

DBSMなんてただのデータ置き場だというくらいの扱い。

一方で「ORMは所詮はSQLビルダー。要らない!」という思想もある。
ORMが吐くSQLが「想像できない」からパフォーマンスが悪いSQLが吐かれていても分かりにくい。

ActiveRecordはログ出力機能ONにしておけば、すべてのSQLをきれいに表示してくれるので「想像しにくい」のは心外なのだが、開発スタイルとしてログを見る習慣が少ない人もいるのも事実。実行せずともソースだけをみるだけでどんなSQLが流れるかを想像できるほうがいいという理屈もわかる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?