Bigtable/Datastore (GAE) のデータ モデルはどのように設計しますか?
-
09-06-2019 - |
質問
Google App Engine データストアは以下に基づいているため、 ビッグテーブル それがリレーショナル データベースではないことはわかっていますが、どのように設計すればよいでしょうか? データベーススキーマ/データ・モデル このタイプのデータベース システムを使用するアプリケーション向けですか?
解決
bigtable スキーマの設計はオープンなプロセスであり、基本的に次のことを考える必要があります。
- 使用するアクセス パターンとそれぞれの使用頻度
- あなたのタイプ間の関係
- どのようなインデックスが必要になるか
- 使用する書き込みパターン (負荷を効果的に分散するため)
GAE のデータストアは、データを自動的に非正規化します。つまり、各インデックスにはデータの (ほぼ) 完全なコピーが含まれているため、インデックスごとに書き込みの実行にかかる時間と使用されるストレージ容量が大幅に増加します。
これが当てはまらない場合、データストア スキーマの設計はさらに多くの作業が必要になります。各タイプの主キーについて慎重に検討し、その決定がデータの局所性に与える影響を考慮する必要があります。たとえば、ブログ投稿をレンダリングするときは、それに付随するコメントを表示する必要があるため、各コメントのキーは関連する投稿のキーで始まる可能性があります。
データストアの場合、これはそれほど大きな問題ではありません。使用するクエリは、「select * from comment where post_id = n」のように見えます。 (コメントのページを作成する場合は、制限条項と「and comment_id> last_comment_id」の可能なサフィックスもあります。)そのようなクエリを追加すると、DataStoreはインデックスを構築し、読み取りは魔法のように速い。
留意すべき点は、インデックスを追加するたびに追加コストが発生することです。使用するアクセス パターンをできるだけ少なくすることが最善です。これにより、GAE が構築するインデックスの数が減り、データに必要な総ストレージが減ります。
この回答を読んでみると、少し曖昧であることがわかります。設計に関する実践的な質問が、問題の範囲を絞り込むのに役立つでしょうか?:-)
他のヒント
www.web2py.com を使用できます。モデルとアプリケーションを一度構築すると、GAE だけでなく、SQLite、MySQL、Posgres、Oracle、MSSQL、FireBird でも動作します。
GAE は Django でのデータ管理方法に基づいて構築されているため、Django のドキュメントには同様の質問に対処する方法に関する多くの情報があります (たとえば、「 ここ, 、「最初のモデル」まで下にスクロールします)。
つまり、データベース モデルを通常のオブジェクト モデルとして設計し、GAE にすべてのオブジェクト リレーショナル マッピングを分類させます。