さて、このような議論があるときは常に、オブジェクトリレーショナルマッパー( "ORM")とデータベース抽象化レイヤーを明確に区別することが重要です。ORMは一種のデータベース抽象化レイヤーですが、すべてのデータベース抽象化レイヤーがORMであるとは限りません。これを把握するための研究に一つの良いツールは、Pythonの人気があるSQLAlchemyのの「SQLツールキットとして法案自体をライブラリ、およびこれらは異なるものであるという考えを持つオブジェクトリレーショナルマッパー」(私の太字)、。彼らが主要な機能のページに置いたように:
ORMは不要
SQLAlchemyは、CoreとORMとして知られる2つの異なるコンポーネントで構成されています。コア自体は完全な機能を備えたSQL抽象化ツールキットであり、さまざまなDBAPIの実装と動作に対する抽象化のスムーズなレイヤーを提供します。また、生成Python表現によるSQL言語の表現を可能にするSQL Expression Languageも提供します。既存のスキーマをイントロスペクトするだけでなく、DDLステートメントを発行できるスキーマ表現システム、およびPythonタイプからデータベースタイプへのマッピングを可能にするタイプシステムは、システムを完成させます。オブジェクトリレーショナルマッパーは、コア上に構築されるオプションパッケージです。
フロントページでは、ORMについて次のように説明しています。
SQLAlchemyは、オブジェクトリレーショナルマッパー(ORM)で最も有名です。これは、データマッパーパターンを提供するオプションのコンポーネントです。クラスを自由にデータベースにマッピングすることができ、さまざまな方法でオブジェクトモデルとデータベーススキーマを開発できます。最初からきれいに切り離された方法。
ORMの重要な考え方は、有名なオブジェクトリレーショナルインピーダンスの不一致を埋めることです。これは、ユーザー定義クラスとデータベーススキーマのテーブルとの関係を定義し、アプリケーションのクラスに自動「保存」および「ロード」操作を提供することを意味します。
対照的に、非ORMデータベース抽象化レイヤーは、オブジェクト指向ではなく、リレーショナルデータモデルとSQLによりコミットする傾向があります。そのため、テーブルとクラス間の「マッピング」を特徴とし、データベーススキーマをプログラマから隠すのではなく、データベースをプログラマに公開する傾向がありますが、APIと抽象化は優れています。たとえば、SQLクエリビルダーを使用すると、次のように、文字列を操作せずにプログラムで複雑なSQLクエリを生成できます(JavaのjOOQライブラリの例)。
// Typesafely execute the SQL statement directly with jOOQ
Result<Record3<String, String, String>> result =
create.select(BOOK.TITLE, AUTHOR.FIRST_NAME, AUTHOR.LAST_NAME)
.from(BOOK)
.join(AUTHOR)
.on(BOOK.AUTHOR_ID.equal(AUTHOR.ID))
.where(BOOK.PUBLISHED_IN.equal(1948))
.fetch();
さて、Playフレームワークは、私が今説明したものと100%一致しているようには見えませんが、彼らの議論はこの一般的な空間にあるようです。
jOOQライブラリーは、ORMのカウンターポイントとして検討する価値があります。また、読む価値のある関連ブログエントリもあります。