Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

RDBとの比較で理解する、MBaaSのデータストアの基本

MBaaSと連携するAndroidアプリを作る 第3回

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2014/10/03 14:00

ダウンロード StampTime_03.zip (2.2 MB)

 本記事は、MBaaSであるニフティクラウド mobile backend(NCMB)と連携するAndroidアプリ開発の解説記事です。グループウェアとしてタスク(仕事)に費やした時間を記録、集計するアプリを作ってみます。NCMBの機能としては、主にユーザー登録・認証、データストアを利用し、MBaaSを使うアプリ開発の手順と便利なところを解説していきたいと思います。前回はログイン・ログアウト処理とユーザー登録処理を作成しました。今回はMBaaSのデータストアの基本について、リレーショナルデータベース(RDB)と比較しながら解説していきたいと思います。

目次

対象読者

 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のイメージ
リレーショナルデータベースのイメージ

 この図のようにRDBでは、2次元の「表(テーブル)」としてデータを管理します。一つのデータベースには複数のテーブルを持つことができます。

 テーブルは関連のある「列(フィールド)」で構成されます。たとえば、名簿テーブルを作成する場合、ある人の名前に関連するフィールドとしては、性別や生年月日、住所などが考えられるでしょう。RDBでは、まず、「スキーマ」と呼ばれるテーブル定義を作成します。このテーブルにはどんな列を持つのか、また、その列のデータ型は何か、を必要な列の分だけ定義していきます。

 たとえば、オープンソースデータベースとして有名なMySQLの整数型にはTINYINT、SMALLINT、MEDIUMINT、INT、BIGINTと4つもバリエーションがあります。何が違うのかというと、データを記憶するために使うバイト数が違うのです。したがって、記憶できる数値の範囲が異なります。 表はオープンソースデータベースとして有名なMySQLのデータ型の一部ですが、RDBには一般に多くの種類のデータ型が用意されています。

 RDBが普及し始めた頃は、ハードディスクを始めとする補助記憶装置は高価でした。記憶容量当たりの単価が高く、今のようにテラバイト(TB)やギガバイト(GB)の製品は存在しませんでした。RDBを使うエンジニアやプログラマが頭を悩ますテーマは、いかに無駄なく情報をデータベースに詰め込み、効率よく取り出すかでした。ですから、テーブル定義は気を遣う重要な仕事なのです。

 次の表は、MySQLで名簿テーブルをテーブル定義した例です。

名簿テーブルを例としたRDBのテーブル定義
項目名 データ型 備考
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は指定しなくても自動的に作成されます。ですから、事前の定義なしでもクラスにレコードを作成していくことができるわけです。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 金宏 和實(カネヒロ カズミ)

     富山県高岡市出身で在住。ソフトウェア開発者兼ライター。 株式会社イーザー 関西学院大学文学部仏文科卒。第一種情報処理技術者(今で言うと、応用情報技術者。第一種→ソフ開→応用と変遷したようだ) 主な著書 『作ればわかる!Androidプログラミング第2版 -SD...

バックナンバー

連載:MBaaSと連携するAndroidアプリを作る
All contents copyright © 2005-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5