Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
[第2回 Azure Cosmos DB 勉強会] Data modelling and pa...
Search
SATO Naoki (Neo)
September 13, 2020
Technology
0
860
[第2回 Azure Cosmos DB 勉強会] Data modelling and partitioning in Azure Cosmos DB (Azure Cosmos DB でのデータモデリングとパーティション分割)
https://satonaoki.wordpress.com/2020/09/13/jcdug-cosmos-db-data-modeling/
SATO Naoki (Neo)
September 13, 2020
Tweet
Share
More Decks by SATO Naoki (Neo)
See All by SATO Naoki (Neo)
Microsoft Build 2024 Updates
satonaoki
0
190
LLMOps with Azure Machine Learning prompt flow
satonaoki
1
530
マルチクラウド時代の企業における生成AIとデータベースの関係 (Oracle Technology Day)
satonaoki
0
730
Microsoft Copilot, your everyday AI companion (Machine Learning 15minutes! Broadcast #82)
satonaoki
0
1.1k
Microsoft Build 2023 Updates – Copilot Stack and Azure OpenAI Service (Machine Learning 15minutes! Broadcast #78)
satonaoki
2
1k
Microsoft + OpenAI: Recent Updates (Machine Learning 15minutes! Broadcast #74)
satonaoki
1
1k
30分でわかるマイクロサービスアーキテクチャ 第2版
satonaoki
9
6.4k
[Machine Learning 15minutes! Broadcast #67] Azure AI - Build 2022 Updates and more...
satonaoki
0
330
[Machine Learning 15minutes! #61] Azure OpenAI Service
satonaoki
0
480
Other Decks in Technology
See All in Technology
Snykで始めるセキュリティ担当者とSREと開発者が楽になる脆弱性対応 / Getting started with Snyk Vulnerability Response
yamaguchitk333
2
180
Wantedly での Datadog 活用事例
bgpat
1
440
サービスでLLMを採用したばっかりに振り回され続けたこの一年のあれやこれや
segavvy
2
420
NilAway による静的解析で「10 億ドル」を節約する #kyotogo / Kyoto Go 56th
ytaka23
3
380
re:Invent 2024 Innovation Talks(NET201)で語られた大切なこと
shotashiratori
0
310
なぜCodeceptJSを選んだか
goataka
0
160
どちらを使う?GitHub or Azure DevOps Ver. 24H2
kkamegawa
0
770
多領域インシデントマネジメントへの挑戦:ハードウェアとソフトウェアの融合が生む課題/Challenge to multidisciplinary incident management: Issues created by the fusion of hardware and software
bitkey
PRO
2
100
UI State設計とテスト方針
rmakiyama
2
580
新機能VPCリソースエンドポイント機能検証から得られた考察
duelist2020jp
0
220
Qiita埋め込み用スライド
naoki_0531
0
5.1k
LINE Developersプロダクト(LIFF/LINE Login)におけるフロントエンド開発
lycorptech_jp
PRO
0
120
Featured
See All Featured
Fireside Chat
paigeccino
34
3.1k
GitHub's CSS Performance
jonrohan
1030
460k
Measuring & Analyzing Core Web Vitals
bluesmoon
4
170
Rails Girls Zürich Keynote
gr2m
94
13k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
2
170
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
17
2.3k
Making Projects Easy
brettharned
116
5.9k
A better future with KSS
kneath
238
17k
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
4 Signs Your Business is Dying
shpigford
181
21k
Building Better People: How to give real-time feedback that sticks.
wjessup
365
19k
Transcript
Data modelling and partitioning in Azure Cosmos DB (Azure Cosmos
DB でのデータ モデリングとパーティション分割)
Session's objectives
What is Azure Cosmos DB? Non-relational and horizontally scalable
What is Azure Cosmos DB? horizontally scalable
What is Azure Cosmos DB? non-relational
What is Azure Cosmos DB? non-relational and horizontally scalable
So is Azure Cosmos DB suitable for relational workloads?
Let's look at a concrete example
Identifying the operations we have to serve
Now let's implement this model on Azure Cosmos DB!
Starting with the Customer entity
Starting with the Customer entity
To embed or to reference?
To embed or to reference? - - - - -
-
Our first entity: Customer
Customer customers PK: ?
What is partitioning?
What is partitioning? logical partitions
What is partitioning? Andrew Theo Mark Tim Deborah Luis
What is partitioning? Max size: 20 GB Max size: 2
MB
What is partitioning?
What is partitioning?
What is partitioning?
What is partitioning? Andrew Theo Mark Tim Deborah Luis SELECT
* FROM c WHERE c.username = 'Mark' our partition key
What is partitioning? Andrew Theo Mark Tim Deborah Luis SELECT
* FROM c WHERE c.favoriteColor = 'orange' ?
Choosing a partition key for customers customers PK: ?
Choosing a partition key for customers customers PK: ?
Choosing a partition key for customers customers PK: id
Choosing a partition key for customers customers PK: id
Next: product categories
Product categories
Product categories productCategories PK: ?
Product categories productCategories PK: ? SELECT * FROM c
Product categories productCategories PK: type
Next: product tags
Product tags
Product tags productTags PK: ?
Product tags productTags PK: ?
Product tags productTags PK: type
Next: products
Products
Products
Products products PK: ?
Products products PK: ? CategoryA CategoryC CategoryB SELECT * FROM
c WHERE c.categoryId = 'CategoryA'
Products products PK: categoryId category name? tag names?
Products: how to return category and tag names? products SELECT
* FROM c WHERE c.categoryId = 'CategoryA' productCategories SELECT c.name FROM c WHERE c.id = 'CategoryA' productTags SELECT * FROM c WHERE c.id IN ('<tagId1>', '<tagId2>', '<tagId3>')
Introducing denormalization
Products: denormalizing category and tag names products PK: categoryId
Products: keeping everything in sync productCategories productTags products
Cosmos DB's change feed
Products: keeping everything in sync productCategories productTags products
Next: sales orders
Sales orders
Sales orders
Sales orders salesOrders PK: ?
Sales orders salesOrders PK: ?
Sales orders salesOrders PK: ? CustomerA CustomerC CustomerB SELECT *
FROM c WHERE c.customerId = 'CustomerA'
Sales orders salesOrders PK: customerId
Sales orders salesOrders PK: customerId customers PK: id
Mixing entities in the same container?
Sales orders salesOrders PK: customerId customers PK: id
Sales orders: mixing with customers customers PK: id
Sales orders: mixing with customers customers PK: customerId
Sales orders: mixing with customers customers PK: customerId
Sales orders: mixing with customers CustomerA CustomerC CustomerB customer sales
orders customers PK: customerId
Sales orders customers PK: customerId SELECT * FROM c WHERE
c.customerId = 'CustomerA' AND c.type = 'salesOrder'
Sales orders customers PK: customerId
Denormalizing the count of sales orders per customer
Denormalizing the count of sales orders per customer
Denormalizing the count of sales orders per customer CustomerA CustomerC
CustomerB customer sales orders customers PK: customerId
Denormalizing the count of sales orders per customer CustomerA CustomerC
CustomerB update the customer add a sales order customers PK: customerId
Denormalizing the count of sales orders per customer CustomerA CustomerC
CustomerB update the customer add a sales order
Sales orders customers PK: customerId SELECT * FROM c WHERE
c.type = 'customer' ORDER BY c.salesOrderCount DESC
Our final design customers PK: customerId productCategories PK: type productTags
PK: type products PK: categoryId
Our final design, optimized! customers PK: customerId productMeta PK: type
products PK: categoryId
Key takeaways
Going further https://docs.microsoft.com/azure/cosmos-db/modeling-data https://docs.microsoft.com/azure/cosmos-db/how-to-model-partition-example https://devblogs.microsoft.com/cosmosdb/data-modeling-and-partitioning-for-relational-workloads/ https://github.com/AzureCosmosDB/labs/blob/master/readme.md https://github.com/AzureCosmosDB/labs/blob/master/decks/Data-Modeling.pptx