Google App Engineを使い始めた人がまず悩むのが、独自の分散データベースサービスである「Datastore」の使い方だと思います。「Datastoreを制するものがGoogle App Engineを制する」とまでいわれるほどです。

 よく「制約がきつい」といわれるDatastoreですが、その検索速度を上げるためのスキーマ設計に関する設計ノウハウを紹介しましょう。データの非正規化と、テーブルのキーの選び方がポイントになります。

 なおDatastoreでは、RDBとは異なる用語を使います。テーブルは「カインド」、レコードは「エンティティー」、フィールド(カラム)は「プロパティー」などと呼びます。ただし本連載では分かりやすさのため、RDBの用語に置き換えて説明します。

四つの方法で非正規化する

 Google App EngineのDatastoreに関しては、よく「必要であれば非正規化すること」と解説されます。しかし非正規化といわれても、具体的にどうすればよいのか分からない方も少なくないと思います。

 筆者の経験では、Datastoreにおけるデータの非正規化は、大きく4種類に分類できます。それ以外のケースもありますが、大半のシステムではこの4種類で済みます。4種類に絞って非正規化するのが、ポイントになります。

(1)検索結果として表示するための非正規化

 一つ目は、検索結果として表示するための非正規化です。

 Datastoreに格納するテーブルとして、商品カテゴリーマスター、商品マスター、取扱商品マスター、支店マスターという四つを考え、それぞれ下記のように正規化されているとします(図1上)。「Key」がテーブルの主キーで、コロン記号(:)の後に「フィールド名(フィールドの説明)」というように書いているのがテーブルのフィールドです。

 ・商品カテゴリーマスター
  Key(商品カテゴリーコード): name(商品カテゴリー名)
 ・商品マスター
  Key(商品コード): name(商品名)、
            category(商品カテゴリーマスターキーへの参照)
 ・取扱商品マスター
  Key(自動採番): branch(支店マスターキーへの参照)、
           item(商品マスターキーへの参照)
 ・支店マスター
  Key(支店コード): name(支店名)

図1●目的に合わせて非正規化する
[画像のクリックで拡大表示]

 なおDatastoreでは、キーの名前は常に「__KEY__」なので、ここでは、それに合わせて主キーの名前を「Key」としました。「××マスターキーへの参照」とあるのは、Datastore特有の「キーオブジェクト」を指していますが、大ざっぱに言えば、××マスターというテーブルでキーとして使っている「××コード」のことだと思ってください。例えば取扱商品マスターが持つフィールド「支店マスターキーへの参照」は、「支店コード」のことです。取扱商品マスターは、「支店マスターキーへの参照」をフィールドとして持っているため、支店コードで検索することができます。

 上記のようなテーブルがあったとして、支店コードを指定して、支店名と取扱商品名を一覧したいとき、RDBでは以下のようなSQL文で容易に実装できます。

  取扱商品マスター、支店マスター、商品マスターをジョインし、
  「支店マスター.Key = 支店コード」という条件で検索して、
  支店名と商品名を結果として得る

 一方、Google App EngineのDatastoreにはジョインの機能がないという制約があります。そこで以下のように、検索対象のテーブル(取扱商品マスター)に別テーブルのフィールドを重複して持たせます(図1下)。太字が非正規化によって追加したフィールドです。

 ・取扱商品マスター
  Key(自動採番): branch(支店マスターキーへの参照)、
           item(商品マスターキーへの参照)、
           branchName(支店名)、itemName(商品名)

 こうすることで、支店コード(支店マスターキーへの参照)を検索条件として取扱商品マスターだけを調べ、支店名と商品名を得られるようになります。