Google App EngineデータストアはBigtableに基づいており、リレーショナルデータベースではないことがわかっているため、このタイプのデータベースシステムを使用するアプリケーションのデータベーススキーマ/データモデルをどのように設計しますか?
3 に答える
BigTableスキーマの設計はオープンプロセスであり、基本的に次のことを考慮する必要があります。
- 使用するアクセスパターンとそれぞれの使用頻度
- タイプ間の関係
- 必要なインデックス
- 使用する書き込みパターン(負荷を効果的に分散するため)
GAEのデータストアは自動的にデータを非正規化します。つまり、各インデックスにはデータの(ほとんど)完全なコピーが含まれているため、すべてのインデックスは書き込みの実行にかかる時間と使用されるストレージスペースを大幅に増加させます。
そうでない場合は、データストアスキーマの設計がはるかに手間がかかります。各タイプの主キーについて慎重に検討し、データの局所性に対する決定の影響を考慮する必要があります。たとえば、ブログ投稿をレンダリングするときは、それに合わせてコメントを表示する必要があるため、各コメントのキーは、関連する投稿のキーで始まる可能性があります。
データストアでは、これはそれほど大きな問題ではありません。使用するクエリは、「Select * FROM Comment WHERE post_id=N」のようになります。(コメントをページングする場合は、制限句と、「ANDcomment_id> last_comment_id」のサフィックスを付けることもできます。)このようなクエリを追加すると、データストアがインデックスを作成し、読み取りが次のようになります。魔法のように速い。
覚えておくべきことは、インデックスを追加するたびに追加のコストが発生することです。GAEが構築するインデックスの数が減り、データに必要なストレージの合計が減るので、アクセスパターンをできるだけ少なくすることが最善です。 。
この答えを読んで、私はそれが少し曖昧だと思います。たぶん、実践的な設計の質問は、これを絞り込むのに役立つでしょうか?:-)
www.web2py.com を使用できます。モデルとアプリケーションを一度ビルドすれば、GAE だけでなく、SQLite、MySQL、Posgres、Oracle、MSSQL、FireBird でも動作します。
GAEはDjangoでのデータの管理方法に基づいて構築されているため、Djangoのドキュメントに同様の質問に対処する方法に関する多くの情報があります(たとえば、ここを参照して、「最初のモデル」までスクロールしてください)。
つまり、dbモデルを通常のオブジェクトモデルとして設計し、GAEにすべてのオブジェクトリレーショナルマッピングを分類させます。