はじめに
前回は、データストアの基本について、リレーショナルデータベース(RDB)と比較しながら解説し、ダッシュボードからデータストアにクラスを作成してみました。最後には、Androidのプログラムから、事前にクラスを作成せずに、データストアにレコード(クラスのオブジェクト)を保存する方法を説明しました。MBaaSのKey-Value形式のデータストアの基本が理解できたかと思います。
今回は、関連オブジェクトの保存と取得に進みます。前回に引き続き、データストアの仕組みをRDBと比較しながら解説します。
対象読者
MBaaSと連携するAndroidアプリを開発したい方。JavaとEclipseについては解説しませんので、JavaとEclipseの基本的な知識があると読みやすいでしょう。
必要な環境
- JDK
- Eclipse
- Android SDK
- ニフティクラウド Mobile backend Basic(無料版)
関連オブジェクトとは何かをRDBとの比較で知る
さて、今回はいきなり「関連オブジェクト」という名前が出てきたので、面食らわれたかもしれませんね。今回やりたいことをまずRDBベースで説明しましょう。
![RDBの場合(商品マスタと売上データ)](http://cz-cdn.shoeisha.jp/static/images/article/8167/8167_table.gif)
商品マスタがすでに登録されていて、売上データを作成するイメージです。RDBではデータの矛盾や重複を避けるために、冗長なデータを記録しません。たとえば、売上データにおいて、商品を一意に識別する商品IDさえあれば、商品名は省略できます。また、コンビニのように定価販売しかしないのであれば、単価も商品マスタ上にだけあればよいということになります。
よって、この場合、売上データには、売上データを一意に識別するIDと売上日付、そして、商品を指定するための商品IDと数量があればよいという考え方になります。売上金額は数量と商品マスタの単価を掛けて求めればよいし、消費税額は売上日で適正な消費税率を求めて計算すればよいということになります。
データベースの正規化という考え方を用いれば、これが正しいテーブル設計ということになりますが、現実的はさまざま理由で冗長に思えるフィールドも定義することが多いです。
そして、売上データを表示するときは、商品IDを使って商品名と単価を取得します。RDBの場合は参照したいテーブルの主キーを、自分のテーブル(のフィールド)に外部キーとして持つことで、他のテーブルとの関連(リレーション)を築いていくわけです。
MBaaSでリレーショナルなデータを扱う
では、NCMBのデータストアのクラスではどうでしょうか。前回作成したTaskClassには、タスク名(仕事の名前)を登録していくのでしたね。
フィールド名 | データ型 | 内容 | User/System |
---|---|---|---|
objectId | 文字列 | ID | System |
taskName | 文字列 | タスク名 | User |
createDate | 日付 | 作成日時 | System |
updateDate | 日付 | 更新日時 | System |
TaskClassにはレコード(オブジェクト)として、グループでやらなくてはいけない仕事をどんどん登録していきます。たとえばWebシステムを開発している小規模な会社やグループを考えると良いでしょう。A社の受注管理のシステムやB社の進捗管理のシステムといろいろ案件があり、案件を分解すると、提案書の作成、システム設計から始まり、サーバー設定、プログラミング、テスト、メンテナンスといろいろやることがあります。これらの単位で仕事をタスクとして登録するイメージです。
そして、このアプリの利用者はこれらのタスクの内、複数のタスクに関与します。たとえば、mさんはA社の受注管理のシステムの提案と設計とテストを担当し、nさんはA社の受注管理のシステムのプログラミングとB社の進捗管理のシステムのプログラミングに関わるという感じです。
担当者は、自分がどのタスクにどれくらいの時間を掛けたのかを知りたい。そして、管理者はグループとしてそのタスクにどれくらい時間が掛かっているのか集計したい。そんな想定のアプリを作っていきます。
そこで、担当者はあるタスクに取り掛かるときに、Android端末に表示されるたくさんのタスクの内、どれかをタップします。これがそのタスクを始めますという操作になります。
タスクをタップしたら、CurTaskClassのオブジェクトを作成します。CurTaskClassのフィールドをみていきましょう。objectIdはシステムが自動的に付けてくれるオブジェクトの識別用IDです。UserNameにはログインしているユーザーの名前を保存します。そして、次のtaskが重要です。taskはUserNameさんが始めた仕事を表します。
フィールド名 | データ型 | 内容 | User/System |
---|---|---|---|
objectId | 文字列 | ID | System |
UserName | 文字列 | getCurrentUser()の戻り値 | User |
task | 参照 | taskClassオブジェクトへの参照 | User |
startTime | 日付 | 開始日時 | User |
createDate | 日付 | 作成日時 | System |
updateDate | 日付 | 更新日時 | System |
リレーショナルデータベースの世界では、taskフィールドにはTaskClassのobjectIdを入れるところですが、NCMBのデータストアでは、関連オブジェクトへの参照を記録します。関連オブジェクトへの参照とは、別のクラスのあるオブジェクト(レコード)を指すポインタです。NCMBでは関連オブジェクトとしてリレーションを表現します。
そして、startTimeには、そのタスクを始めますよとタップした日時を記録します。これで、ある人があるタスクを始めた時間が記録できるわけです。