スティルハウスの書庫の書庫

はてなダイアリーで書いてた「スティルハウスの書庫」を移転してきました。

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の特徴的な機能
    • Ancestor:root、親、子といったentityの階層構造とグループ(entity group)を作れる
    • Heterogenous property types: 個々のentityごとにpropertyの型を変えることができる
    • multi-value properties: 1つのpropertyに複数の値(List Property)を保存できる
    • variable properties: entityごとにスキーマを変えることができる

Soft Schema

  • Soft Schemaとは
    • 「アプリケーション層のみが制約を受けるスキーマ
    • 開発が簡単。タイプセーフなプロトタイピングをすばやく実施
      • 従来は、JavaSQLのそれぞれに個別の設計や実装、デプロイメント、テストが必要だった
      • SSではすべてがJavaに統一される
  • DatastoreでのSS
    • 既存のAPI(JDO/JPA)を通じて利用できる
    • 移植が簡単。もしGAEが適さないと分かった場合でも、そのまま他の環境に移植できる。GAEにロックインされない
    • List Propertyによるクエリ:とても便利
  • リレーションシップ管理
    • オブジェクト間の関連に限らず、永続化、オブジェクトとデータストアのマッピングなどをJDO/JPAが集中管理
    • それらをアプリ内のさまざまな部分(Javaクラス、設定ファイル、SQLコード、スキーマJDBCなど)で実装・管理する必要がなく、メンテナンス性が高い
  • 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をキャンセルする、など
  • クエリの扱い
    • 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など):関数適用後の値を別カラムに入れておく
      • 書き込み時にできるだけ事前処理を行っておくことで、読み込みを高速化できる
    • そのほか、条件演算子の不足:メモリ上でフィルタ

Questions

  • 大規模なグラフ(関連)を一括で取得するような、何らかのプリフェッチ機能(eagar loading)はないか?
    • joinできないので、サポートできない。複数のクエリが必要となる。JDOのバッチgetは利用できる。
  • 分散txをサポートする予定はあるか?
    • 未定。アプリレベルでGAE上で分散txを実装した例がある(他セッションを参照)
  • DataNuculeusのダーティフィールド検出を使っているか?
    • 使っていない。Datastoreでは1つのプロパティのみの更新ができないので、全フィールドの更新となる。
  • JDOのowned関係にないentity間でEGは形成できるか?
    • できる。Low Level APIを使う必要はなく、他のentityのキーを持つunowned関係を明示的に記述する必要がある。