アプリケーションのデータ設計
前のページで見たような動作を実現するため、アプリケーション内のデータ構造を設計します。
このページでは、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 モバイルアプリの解説 に移動してください。