The Softer Side Of Schemas - Mapping Java Persistence Standards To the Google App Engine Datastoreを見たメモ
The Softer Side Of Schemas - Mapping Java Persistence Standards To the Google App Engine Datastore
Datastoreについて
- ストレージをシンプルにする
- Gmailのような規模でなくても、どんなアプリでもスケーラビリティを考える必要がある。
- Entity
- Kind(テーブル)
- Key(主キー)
- Entity Group(パーティション/階層化の単位)
- Property(カラム)
- Datastoreの特徴的な機能
Soft Schema
- Soft Schemaとは
- DatastoreでのSS
- リレーションシップ管理
- Entity Groupの透過的な管理
- 1つのEGの書き込み処理は、1〜10回/sec程度に限られる
- "owned"関連を持つentity同士でEGを形成する:EGの使い方を理解しやすい
- "unowned"関連はサポートしていない:EGがないのでtx管理できない
GAEへのマイグレーション
- プライマリーキーの扱い
- 単一カラムの場合はそのまま使える
- 複合キーの場合はentityの親子関係に置き換える
- N:N用のマッピングデーブル(ジョインテーブル)はList Propertyに置き換える
- トランザクションの扱い
- データモデルからEGのroot entityを見つける
- オンラインサービスでは「ユーザー」データが最適な場合が多い
- 複数のroot(EG)に対するトランザクションが必要な場合
- 仕様を見直す
- compensating txを実装:2つめのtxが失敗した場合は、最初のtxをキャンセルする、など
- データモデルからEGのroot entityを見つける
- クエリの扱い
- joinは使えない:非正規化するか、複数のクエリに分割する
select * from PERSON p, ADDRESS a where a.person_id = p.id and p.age > 25 and a.country = “US” ↓ select from com.example.Person where age > 25 and country = “US”
-
- 関数が使えない(toUpperなど):関数適用後の値を別カラムに入れておく
- 書き込み時にできるだけ事前処理を行っておくことで、読み込みを高速化できる
- そのほか、条件演算子の不足:メモリ上でフィルタ
- 関数が使えない(toUpperなど):関数適用後の値を別カラムに入れておく
GAEからのマイグレーション
Questions
- 大規模なグラフ(関連)を一括で取得するような、何らかのプリフェッチ機能(eagar loading)はないか?
- joinできないので、サポートできない。複数のクエリが必要となる。JDOのバッチgetは利用できる。
- 分散txをサポートする予定はあるか?
- 未定。アプリレベルでGAE上で分散txを実装した例がある(他セッションを参照)
- DataNuculeusのダーティフィールド検出を使っているか?
- 使っていない。Datastoreでは1つのプロパティのみの更新ができないので、全フィールドの更新となる。
- JDOのowned関係にないentity間でEGは形成できるか?
- できる。Low Level APIを使う必要はなく、他のentityのキーを持つunowned関係を明示的に記述する必要がある。