【R】ODBCのごく基本と「RODBC」と「DBI」+「odbc」(と他にも)の違いを勉強

比較

データベースに関するRのライブラリはとても多いです。

「RSQLite」や「RPostgreSQL」など分かりやすいライブラリもありますが、SQL Serverとの接続で「RODBC」と「odbc」、どちらのライブラリを使えばいいのか分からず結構悩みました。

ネットの情報は「RODBC」が豊富ですが「odbc」の方が良いとの情報もある上、使う上では何がどう違うかの整理も含めて違いを調べました。

ODBCの基本

何よりも、ODBCの仕組みを理解していないのでまずはそこから。

IBMのサイトに分かりやすく記載してくれていました。

ODBC は、データベース管理システム (DBMS) にアクセスするプログラムを、特定の DBMS 設計に依存しないようにして、どのように作成するかという共通の問題に対する解決法を提供する、業界標準のアプリケーション・プログラム・インターフェース (API) です。

ODBCコンポーネント図

ODBC ドライバーおよびデータベース・アクセス・ユーティリティー

自分なりの解釈(イメージ)

  1. アプリケーション(今回はR)からODBCインターフェースにデータベースの接続を要求
  2. ODBCインターフェースが指定されたドライバー・データソースを使ってデータベースに接続
  3. ODBCインターフェースがアプリケーションに接続完了を返す

ここまで調べて、やっとODBCはインターフェースしか提供していないので別途ODBCドライバとデータソースが必要な事がわかりました。

で、「RSQLite」や「RPostgreSQL」はODBCドライバも含めたライブラリ、「RODBC」「odbc」はODBCインターフェースのライブラリのためODBCドライバのセットアップが必要な事も理解できました。

ODBCドライバ・データソースのセットアップ

(作成中)

基本を理解せずコピペで何とか動かしているのが原因ですが…。

「RODBC」と「odbc」の違い

どちらもODBCインターフェースのライブラリなのは分かりましたが、結局何が違うのか?の比較です。

細かい点は別として、ユーザーとしてはパッケージの依存関係(特にDBIの使用)が大きな違いと思います。

パッケージの依存関係

RODBC

他のパッケージに依存せず、r-baseだけで動作します。

RODBCDBIなんて言うのもありましたが、今回はリンクだけ。
RODBCDBI: Provides Access to Databases Through the ODBC Interface

odbc

「DBI」に依存。と言うか、Rからは「DBI」を通して「odbc」を使っているようです。

DBI は、DBMS への接続を「フロントエンド」と「バックエンド」に分離します。アプリケーションは、公開されたフロントエンド API のみを使用します。特定の DBMS (SQLite、MySQL、PostgreSQL、MonetDB など) と通信するバックエンド機能は、S4 メソッドを通じて自動的に呼び出されるドライバー (他のパッケージ) によって提供されます。

Using DBI

また分からなくなりそうですが、多分、ODBCインターフェースの中でフロントエンド(DBI)とバックエンド(odbc)に分かれていると考えています。

結局どっちがいい?

単純にSQL Serverに接続するだけの場合は、正直どっちでも良さそうです。

他のデータベース(PostgreSQLなど)にも接続する場合、ドライバも含まれているパッケージ(RPostgreSQLなど)を使うことが多いと思うので、DBIが同じフロントエンドになる「odbc」が使いやすいかな?とは思います。

後は、大量に保存されているデータベースから必要なデータだけをRに取り込んで分析する場合はデータベース上である程度のデータ加工が必要になると思います。

特にSQLに慣れていない場合は「dplyr」を使うとデータハンドリングが楽になるため、データベース上でのデータ加工が必要な場合は「odbc」を使う方が良さそうです。

知識が無いと、ふとした疑問の解決にも時間がかかるのが良く分かった一件でした。