対象読者
MBaaSと連携するAndroidアプリを開発したい方。JavaとEclipseについては解説しませんので、JavaとEclipseの基本的な知識があると読みやすいでしょう。
必要な環境
- JDK
- Eclipse
- Android SDK
- ニフティクラウド Mobile backend Basic(無料版)
RDBとの比較でMBaaSのデータストアの仕組みを理解する
NCMBをはじめとするMBaaSでは、RDBではなく「Key-Value形式」でデータをストアします。実際にデータストアの機能を使う前に、従来のWebシステムやクライアントサーバーシステムで主に使われているRDBと、Key-Value形式との違いをみていきましょう。
RDBでは
この図のようにRDBでは、2次元の「表(テーブル)」としてデータを管理します。一つのデータベースには複数のテーブルを持つことができます。
テーブルは関連のある「列(フィールド)」で構成されます。たとえば、名簿テーブルを作成する場合、ある人の名前に関連するフィールドとしては、性別や生年月日、住所などが考えられるでしょう。RDBでは、まず、「スキーマ」と呼ばれるテーブル定義を作成します。このテーブルにはどんな列を持つのか、また、その列のデータ型は何か、を必要な列の分だけ定義していきます。
たとえば、オープンソースデータベースとして有名なMySQLの整数型にはTINYINT、SMALLINT、MEDIUMINT、INT、BIGINTと4つもバリエーションがあります。何が違うのかというと、データを記憶するために使うバイト数が違うのです。したがって、記憶できる数値の範囲が異なります。 表はオープンソースデータベースとして有名なMySQLのデータ型の一部ですが、RDBには一般に多くの種類のデータ型が用意されています。
RDBが普及し始めた頃は、ハードディスクを始めとする補助記憶装置は高価でした。記憶容量当たりの単価が高く、今のようにテラバイト(TB)やギガバイト(GB)の製品は存在しませんでした。RDBを使うエンジニアやプログラマが頭を悩ますテーマは、いかに無駄なく情報をデータベースに詰め込み、効率よく取り出すかでした。ですから、テーブル定義は気を遣う重要な仕事なのです。
次の表は、MySQLで名簿テーブルをテーブル定義した例です。
項目名 | データ型 | 備考 |
---|---|---|
ID | INT | 主キー、オートインクリメント(自動採番) |
名前 | CHAR(n) | 文字数を限定しやすい |
性別 | TINYINT | 0:男性、1:女性 |
生年月日 | DATE | - |
住所 | VARCHAR(n) | 文字数を限定しにくい |
IDはレコードを一意に識別する主キーですから、INT型にします。名前と住所はどちらも文字列型ですが、文字数を何文字程度と決めやすい場合は、固定長文字列型であるCHAR型を使います。住所のように長さにバラツキが予想される場合は、可変長文字列型であるVARCHAR型を使います。
性別は男性、女性と文字列で記憶するよりも小さな整数型で0は男性、1は女性と決めて記憶した方が、記憶容量を食いません。また、生年月日はDATE型とします。
このように、まずデータベースをきっちり作成してからプログラムを作成するのが、RDBを使うアプリケーション開発の手順です。
Key-Valueストアでは
では、クラウド時代である現在ではどうでしょうか。ハードディスクやSSDの容量当たりの単価は安くなり、クラウドとして多くのサーバー群が用意されているので、ストレージの容量は簡単にスケールアップできます。
このようなハードウェア環境の中で、NCMBをはじめとするMBaaSでは、データをKey-Valueのペアで記憶します。つまり、"名前":"青木 一郎"という形式で記憶します。
このKey-Value形式のデータストアはRDBに比べて、拡張すること、分散することが容易です。つまり、Key-Value形式のデータストアはスケーラビリティが高いといえます。また、同時に多くのアクセスが発生してもレスポンスが低下しにくいという特徴も兼ね備えています。
なぜかと言うと、RDBではデータを安全に矛盾なく更新するために更新時にはレコードをロックします。同時アクセス数が多いと誰かがロックしたレコードが解放されるのを待つ状態が発生してしまいます。それに対して、Key-Valueストアでは大量のデータを高速に処理するためにロックを掛けないので、待ち状態が発生しません。
では、RDBのレコードのようなイメージは、どうやって表現するのでしょうか。
{"名前":"青木 一郎","性別":"0","生年月日":"1987/10/2","住所":"石川県金沢市大手町◯◯"}
上記のように、Key-Valueをセットにして表現します。
NCMBでは、このKey-Value値のセットをクラスと呼びます。クラスは事前に定義しておいて、プログラムからレコードを登録することもできますし、事前の定義なしで、いきなりレコードを登録することもできます。
なぜそんなことができるかをRDBとの比較で考えましょう。NCMBのクラスでは、文字列、配列、数字、日付、真偽値、オブジェクト、位置情報(緯度・経度)を記憶することができますが、フィールドにデータ型を指定する必要はありません。
そして、フィールド名はKey-Value値のKeyとして渡します。レコードを一意に識別するIDは指定しなくても自動的に作成されます。ですから、事前の定義なしでもクラスにレコードを作成していくことができるわけです。