Azure Cosmos DBのデータ構造

昔書いたCassandraの記事 Cassandraのデータモデル - terurouメモ 的にCosmos DBのデータ構造と用語を整理。

f:id:terurou:20191022223028p:plain

データベースアカウント

  • Azure PortalからCosmos DBを作成するとできるトップレベル要素
    • 図のデータベースよりも上位の存在
  • データベースエンジン(SQL API、Azure Table API、MongoDB API、Cassandra API、Gremlin API、etcd API)はこのレベルでしか設定できない

データベース(図ではDatabase表記)

  • RDBのデータベース(もしくはスキーマ)相当、CassandraのKeyspace相当
  • データベースレベルでスループットをプロビジョニング(上限RUの設定)すると、配下のコンテナー全てでプロビジョニングスループットが共有される

コンテナー(図ではContainer表記)

  • RDBのテーブル相当、CassandraのTable相当
  • スループットはコンテナー個別にも設定することができる
    • Cosmos DBリリース直後はコンテナーに対してしか設定できなかったはずだが、いつの間にかデータベースレベルで設定できるようになっていた

Partition Key

Cosmos DBの設計で特に重要となるポイント

  • CassandraのPartition Key相当、RDBには相当するものはない
    • Partition Keyはプライマリキーではない
  • Partition Keyによって論理パーティションが分割される
  • Partition Keyは複合キーを指定することができる
  • 論理パーティション単位でシャーディングとインデックスの作成が行われる
    • 分散しないPartition Keyを設定してしまうと、データベース全体の性能に影響してしまう
    • とはいえ、論理パーティションを分割しすぎると有効にインデックスが使えなくなってしまう(レンジスキャンしたいケースが典型例)
  • トランザクションは論理パーティション内でのみ有効となる
    • トランザクションは、ストアドプロシージャ等のCosmos DB側で動作するロジックでのみ有効

Item(MSDNでは "項目" と訳されているが…)

  • RDBのレコードに相当
    • もしくは、ドキュメント、エンティティ
  • IDにより識別される

ID

  • いわゆるPrimary Key
  • 一意キー制約は、論理パーティション内で有効
    • コンテナー単位ではないので注意
  • ID指定の検索は速く、RUの消費も最小限になる

参考資料