アプリケーションのデータ設計

前のページで見たような動作を実現するため、アプリケーション内のデータ構造を設計します。

このページでは、Kii Balance で使用しているデータ構造を説明しますが、実際のアプリケーションでは必ずしも同様の設計が最適になるとは限りません。アプリケーションの設計を行うまでには、このチュートリアルの最後に示す アプリケーション設計の最適化 を参照し、最適化の手法も確認しておくことをおすすめします。

Kii Balance でのデータ設計

Kii Balance で使用されている Bucket と KiiObject の例を以下に示します。

収支のデータは、ユーザースコープの Bucket に格納されます。Bucket 名は balance_book です。

ユーザースコープにデータを置くため、格納したデータは他のユーザーからアクセスできません。また、アクセスするには、そのユーザーでのログインが必要です。これにより、不正な参照や書き換えを防止できます。

1 つの KiiObject は、収支の 1 項目に対応します。

{
  "amount": 150000,
  "name": "給料",
  "type": 1
}

ここでの各フィールドは、以下の意味を持ちます。

  • amount

    収入または支出が発生した金額の 100 倍の値を格納します。たとえば、$1500.00 は、150000 とします。理由は、下記の 実数値の回避 を参照してください。

    下記の type フィールドを使うと収入と支出が区別できるため、amount では、支出の場合も正の値を設定するものとします。

  • name

    収支の名目を説明するための文字列を格納します。

    ユーザーが名目を入力しなかった場合は、収入、支出の種別に応じて "Income" または "Expense" という文字列を自動的に設定するように実装されています。

  • type

    収入の場合は 1 を、支出の場合は 2 を設定します。

これ以外にも、Kii Cloud が持つ既定フィールドとして、KiiObject の ID(_id)、作成日時(_created)、更新日時(_modified)などがあります。Kii Balance では、作成日時をデータ一覧画面で表示します。

Kii Cloud SDK の種類によっては、既定フィールドを getCreatedDate() などの専用の API で取得します。また、開発者ポータルでは既定フィールドの名前がそのまま表示されます。

実数値の回避

Kii Cloud では、値として実数値を格納できますが、amount フィールドの設計のように実数値を避けた方がよい場合があります。

  • 一般的に、浮動小数点による計算は誤差が生じるものであるため、収支の計算などには向きません。

  • KiiObject に実数値を格納すると、小数部分が 0 のものと 0 以外のものを正しく検索できません。例えば、1.0 は整数 1 として、1.1 は実数 1.1 として、それぞれ異なる型でインデックスされます。これら、異なる型の間では大小関係が正しく評価されないため、実数の値を検索しても期待した結果が得られない場合があります。

Kii Balance では、これらの問題を回避するため、元のドル単位での値を 100 倍し、セント単位での値として KiiObject に格納します。なお、Kii Balance では amount による検索を行いません。

実際のモバイルアプリでも、フィールド値を整数化した方がよいケースが多くあります。特に実数値での検索を行う場合、データの整数化は必須条件になります。

KiiObject の識別

Kii Balance では、内部処理に KiiObject の ID を使用しています。

KiiObject の ID は、KiiObject を Bucket 内で一意に特定するための文字列です。ID の値は、Kii Cloud が自動的に割り当てることも、作成時に指定することもできます。Kii Cloud が自動的に割り当てた ID は、UUID のため、衝突の可能性はほとんどありませんが、設計上は Bucket 内でのみ一意のものとして取り扱うようにしてください。

なお、Hello Kii では、データ一覧画面の ListView の項目 に KiiObject の URI を使用していました。

KiiObject の URI は、Bucket を特定する情報と、KiiObject の ID の両方が含まれているため、アプリケーション内で一意に KiiObject を特定できます。ただし、URI は Kii Cloud SDK に特有の概念で、REST API で使用することはできません。

ユーザーなどの他のオブジェクトでも ID と URI の表現があります。詳細は下記の より詳しく学びたい方へ のリンクを参照してください。

データの一貫性の確保

Kii Balance のデータ設計では合計の値を KiiObject として保存していない点にご注意ください。合計値は、取得したすべての KiiObject から計算して表示しています。

合計値のように他のレコードの集計結果を保存する設計は、一貫性を保持しにくく、データの不整合を起こす原因になります。詳細は、このチュートリアルの最後の アプリケーション設計の最適化 で説明します。


次は...

以上で、概要のセクションは終わりです。次は、モバイルアプリを解説します。

Android 版は Android モバイルアプリの解説 に移動してください。

iOS 版は iOS モバイルアプリの解説 に移動してください。

より詳しく学びたい方へ

  • Hello Kii でのデータ構造は、データ一覧画面の実装(AndroidiOS)で説明しています。
  • 検索クエリーの機能の詳細や設計上の注意点は、Object の検索(AndroidiOS)を参照してください。
  • オブジェクトの URI やオブジェクトの ID の詳細は、「オブジェクトの ID と URI」(AndroidiOSJavaScript)を参照してください。