データベース

RDBの基礎

永続化

アプリケーションが扱っている、メモリ中のデータは電源を切ると消失してしまうため、不揮発性の媒体(HDD,SSDなど)に保存する必要がある。
独自形式でファイルとして保存することもできるが、開発効率、パフォーマンス、拡張性などの理由で実績のあるデータベースサーバを利用するのが普通となっている。

クライアント-サーバ構成

データベースの機能を提供する「サーバ」、機能を利用する「クライアント」の2つの役割がある。
データベースサーバは通常、独立した別のプロセスとして実行されており(別のコンピュータ上かもしれない)、 クライアントプログラムはサーバに「接続」し、命令とデータを「通信」することにより、データベースの機能が利用される。

リレーショナルデータベース(RDB)

データを表(テーブル)とその関連(リレーション)で表す。
RDBは、業務データの設計と親和性や操作のしやすさ、処理速度、認知度などから現状最も普及している。
Oracle、MSSQL Server、MySQL、PostgreSQL、SQLite 等が有名であり、よく使用されている。
「データベース」という場合、(文脈にもよるが)ほぼRDBのことを指すことが多い。RDB以外のデータベースも数多く存在する。

SQL

RDBにおいて、データベースを操作するために使用される言語。
データベースの構造を定義するための命令や、中のデータを操作するCRUD(Create/Read/Update/Delete)処理のための命令が存在する。その文法に従い複雑な命令も構築でき、発行された命令は、データベースサーバ内で高速に実行される。
Javaプログラム中ではただの「文字列」であり、実行時にその文字列をデータベースサーバに送って初めて内容が実行される。つまり、文法や型に誤りがあるなどしてSQLとして間違っていても、Javaプログラムのコンパイル時にはエラーとして検出されず、実行時になるまで不具合が判明しない(しかも特定の条件のみ発生するケースも多い)。他の部分にも増してテストが重要である。

テーブル分類

業務アプリケーションで使用されるデータの性質上、データのテーブルは下記の2つのタイプに分類できることが多い(当てはまらないケースも存在する)。便宜上の分類であり、データベースサーバ上でのテーブルの扱いが異なるわけではない。

マスターテーブル

台帳と呼ばれるような種類のデータが登録される。
運用の一環として、必要に応じてデータのメンテナンスを行うことも多く、アプリケーションにマスター管理処理を用意することも多い。
顧客情報テーブル、商品テーブル、支社テーブルなど

トランザクションテーブル

取引や処理ごとに追加されていく種類のデータ。日々増え続けていくことになる。明細となる子トランザクションテーブルを持つことも多い。
売り上げテーブル、日報テーブルなど

JDBC

Javaからデータベースに接続するための古くからある、標準的なデータベース接続方式。
データベースサーバごとにJDBCドライバのライブラリが存在するので、それを取得・参照し、プログラム中から使用する。
インターフェースは共通なので、異なるデータベースサーバでも同じ方法で接続できる。
(が、接続の際のパラメータは異なり、結局サーバ固有のSQLの方言もあるので完全に同じには扱えない)

ORマッピング


JavaでRDBを使用する場合、主にJDBCを使用してデータベース操作をSQLで直接行う方法と、 データベースとのやり取りをORマッパーにやってもらう方法とがある。
ORマッパーを利用すると、Javaのプログラム上で扱っているオブジェクトとRDB上のテーブルとを対応付けることにより、 プログラマが直接SQLを書くことなくCRUD操作を行うことができる。
ORMを使用した際の長所短所以下の通り。
  • 「テーブルのデータを処理するためのプログラム」ではなく、「オブジェクトの状態を操作するプログラム」として設計実装ができる。
  • Javaから見ればただの文字列であるSQLを個別に書かなくてよい。
  • SQLはORマッパー内部で自動生成されるので、原理上SQLの文法エラーが発生する余地がない。
  • 使用するDBが変更になっても、ORマッパの設定を変更するだけで動く(ものもある)ためプログラムの変更が少ない
  • SQLを直接使用する場合に比べ、処理のオーバーヘッドがあるため余分な時間がかかる(ORマッパーも内部ではJDBCを使用している)。また、オブジェクト単位での操作になるため、SQLで行えるようなDBサーバ側での複雑な効率的な処理ができない。
  • 本来は必要ない情報である、サロゲートキー(代理ID列)がテーブルに必要になることが多い
  • オブジェクトとテーブルの考え方が微妙に異なる。オブジェクト間の「参照」を、RDBのテーブル間の「関連」で表すため、データ構造を素直に表せなくなることがある

(社内でおこなった演習)

  • MySQLインストール、管理ツールによるSQL操作
  • データベース作成
  • (ユーザ作成)
  • テーブル作成(CREATE TABLE)
  • CRUD操作(INSERT/SELECT/UPDATE/DELETE)
  • JDBCドライバを使用してJavaのプログラムから接続、操作してみる
  • JPA/HibernateによるORマッピングを使用したプログラム

 

Block diagram