こんばんは。今日は、Microsoft Azureが提供するデータベース、CosmosDBのデータモデル設計について学んだことを整理しておこうと思います。
これまで仕事などでもOracle DBなどのRDBMSしか扱ってこなかったわけですが、この度CosmosDBを使う都合が出てきたので、そのデータモデルの設計方法について、RDBMSとどう変わるのかという点を中心に整理しておきたいと思い、調べてみることにしました。
と、探してみると、この点については、Microsoft Azureの公式ドキュメントにちゃんと整理されていましたので、こちらを読みながら、学んだ点をメモしておこうと思います。
というわけで今日の教科書はこちらです。
https://docs.microsoft.com/ja-jp/azure/cosmos-db/modeling-data
CosmosDBのデータモデル設計プラクティス(メモ)
- データはRDBMSのように正規化するでも、非正規化するでもどちらでも良い
- 上記は、トランザクションの性質次第
- 非正規化したデータモデルを、”埋め込みデータモデル”とも呼ぶ
- 埋め込みデータモデルの場合、複数テーブルに渡ってクエリや更新を行う必要がなく、一般的に読み取りのパフォーマンスが向上する
- 埋め込みデータモデルを採用するシナリオは、”頻繁に更新されない”、”埋め込んだデータが際限なく増大しない”、”頻繁にはまとめてクエリされない”場合。
- “埋め込んだデータが際限なく増大する”例として、例えば記事に対するコメントが挙げられる。コメントは大量に追加される可能性もあり、その場合データ項目のサイズが増大し、ネットワーク経由でデータを送受信する場合などにパフォーマンスの問題を引き起こす。
- “頻繁に更新される”例として、大量のユーザが所有する株の株価情報。これを、埋め込みデータモデルで保持していると、数秒おきにユーザの数だけ同一銘柄の株価情報を更新しないといけなくなり、コストが高い。このような場合には正規化しておいた方が得策。
- 埋め込みデータモデルを採用しないシナリオは、逆に”データが頻繁に更新される”、”参照されるデータに制限がない”場合。
なるほど、要は用途によって正規化モデルが適しているか、非正規化モデルが適しているかが決まるので、事前にトランザクションの性質に基づいて十分な検討を、ということのようです。
勉強になりました!
駆け足でしたが、今日はこれでおしまい