SlideShare una empresa de Scribd logo
1 de 93
Descargar para leer sin conexión
Modelowanie danych w DynamoDB
Single Table Design, efektywnie skalowalna warstwa persystencji
$ whoami
Senior Node.js Developer
Serverless & DynamoDB = ❤
Czym jest DynamoDB?
Baza danych która powstała z miłości
Miłości do pieniędzy
“Amazon DynamoDB is a fully managed, serverless,
key-value NoSQL database designed to run high-performance
applications at any scale. DynamoDB offers built-in security,
continuous backups, automated multi-region replication,
in-memory caching, and data export tools.”
https://aws.amazon.com/dynamodb/
“Amazon DynamoDB is a fully managed, serverless,
key-value NoSQL database designed to run
high-performance applications at any scale. DynamoDB offers
built-in security, continuous backups, automated multi-region
replication, in-memory caching, and data export tools.”
https://aws.amazon.com/dynamodb/
“Amazon DynamoDB is a fully managed, serverless,
key-value NoSQL database designed to run
high-performance applications at any scale. DynamoDB
offers built-in security, continuous backups, automated
multi-region replication, in-memory caching, and data export
tools.”
https://aws.amazon.com/dynamodb/
“Amazon DynamoDB is a fully managed, serverless,
key-value NoSQL database designed to run high-performance
applications at any scale. DynamoDB offers built-in
security, continuous backups, automated multi-region
replication, in-memory caching, and data export tools.”
https://aws.amazon.com/dynamodb/
Dlaczego potrzebujemy DynamoDB?
Co się dzieje z RDSem przy pewnej skali...
Dlaczego?
Model konsumpcji danych uległ gwałtownej zmianie. Systemy
IT przestały być domeną
wielkich korporacji, banków czy instytucji rządowych. Dostęp
do internetu, gwałtownie rosnąca ilość urządzeń oraz
ewolucja biznesu wymusza na nas o wiele większy i szybszy
przepływ danych.
Dlaczego DynamoDB oferuje większą wydajność
niż baza relacyjna?
Relacyjne bazy danych są zoptymalizowane do
przechowywania, wynika to z historycznie wysokiego kosztu
pamięci, a relatywnie niskiego kosztu CPU w czasach kiedy
bazy relacyjne powstawały.
DynamoDB jest zoptymalizowane do szybkiego odczytu. Ze
względu na odwrócenie trendu pomiędzy kosztem pamięci a
kosztem CPU, bardziej optymalnym podejściem jest
zmniejszenie kosztu “złożenia” danych, nawet jeśli odbywa
się to kosztem konsumowanej pamięci.
Co gdybyśmy mogli trzymać wszystkie
encje w jednej tabeli?
Co więcej, dostać się do niezbędnych encji
przy użyciu jednego zapytania?
Odpowiedzią na powyższe pytania jest Single
Table Design!
Przydatne narzędzia
1. Kartka i papier (lub dowolny soft do tworzenia
diagramów).
1. Kartka i papier (lub dowolny soft do tworzenia
diagramów).
2. NoSQL WorkBench
1. Kartka i papier (lub dowolny soft do tworzenia
diagramów).
2. NoSQL WorkBench
3. Konto AWS
Rozpoczęcie budowania modelu
Nah, jeszcze nie to!
1. Zrozumienie potrzeb aplikacji
1. Zrozumienie potrzeb aplikacji
2. Stworzenie uproszczonego ERD
1. Zrozumienie potrzeb aplikacji
2. Stworzenie uproszczonego ERD
3. Stworzenie access patternów
1. Zrozumienie potrzeb aplikacji
2. Stworzenie uproszczonego ERD
3. Stworzenie access patternów
4. <tajny składnik nr 1>
1. Zrozumienie potrzeb aplikacji
2. Stworzenie uproszczonego ERD
3. Stworzenie access patternów
4. <tajny składnik nr 1>
5. <tajny składnik nr 2>
Przykład aplikacji do
śledzenia przesyłek
1. Zrozumienie potrzeb aplikacji
Przykłady funkcjonalności
Główną wartością dostarczaną przez aplikację jest
możliwość śledzenia zamówionych przesyłek.
Jako użytkownik, chcę mieć możliwość
poznać status mojej przesyłki.
Jako użytkownik chcę móc nadać przyjazną nazwę
przesyłki
Jako użytkownik chcę wiedzieć kiedy archiwalna
przesyłka została dostarczona
Jako użytkownik chcę móc zmienić swoje dane w
profilu (dark-mode, email do powiadomień, itp.)
1. Zrozumienie potrzeb aplikacji
2. Stworzenie uproszczonego ERD
1. Zrozumienie potrzeb aplikacji
2. Stworzenie uproszczonego ERD
3. Stworzenie access patternów
1. Zrozumienie potrzeb aplikacji
2. Stworzenie uproszczonego ERD
3. Stworzenie access patternów
4. Stworzenie access patternów
1. Zrozumienie potrzeb aplikacji
2. Stworzenie uproszczonego ERD
3. Stworzenie access patternów
4. Stworzenie access patternów
5. Stworzenie access patternów
1. Pobranie meta-danych użytkownika (zdjęcie profilowe, imię, itp)
1. Pobranie meta-danych użytkownika (zdjęcie profilowe, imię, itp)
2. Pobranie przypisanych adresów użytkownika
1. Pobranie meta-danych użytkownika (zdjęcie profilowe, imię, itp)
2. Pobranie przypisanych adresów użytkownika
3. Pobranie wszystkich przesyłek
1. Pobranie meta-danych użytkownika (zdjęcie profilowe, imię, itp)
2. Pobranie przypisanych adresów użytkownika
3. Pobranie wszystkich przesyłek
4. Pobranie zawartości dla przesyłki
1. Pobranie meta-danych użytkownika (zdjęcie profilowe, imię, itp)
2. Pobranie przypisanych adresów użytkownika
3. Pobranie wszystkich przesyłek
4. Pobranie zawartości dla przesyłki
5. Pobranie zdarzeń dla przesyłki
1. Pobranie meta-danych użytkownika (zdjęcie profilowe, imię, itp)
2. Pobranie przypisanych adresów użytkownika
3. Pobranie wszystkich przesyłek
4. Pobranie zawartości dla przesyłki
5. Pobranie zdarzeń dla przesyłki
6. Pobranie zdarzeń oraz zawartości danej przesyłki
1. Pobranie meta-danych użytkownika (zdjęcie profilowe, imię, itp)
2. Pobranie przypisanych adresów użytkownika
3. Pobranie wszystkich przesyłek
4. Pobranie zawartości dla przesyłki
5. Pobranie zdarzeń dla przesyłki
6. Pobranie zdarzeń oraz zawartości danej przesyłki
7. Pobranie zarchiwizowanych przesyłek
Najważniejszym krokiem przy modelowaniu jest wybór
odpowiedniego PK oraz SK!
Rozpoczynamy modelowanie od “korzenia”
Z diagramu relacji encji, możemy zauważyć, że naszą główną
encją z której relacje wychodzą na zewnątrz jest User. Na
podstawie tego, rozsądnym będzie przyjąć, że Partition Key
będzie związany z użytkownikiem. W związku z tym
proponuję przyjąć następujący kształt Partition Key
USER#<USER_ID>
Kształt tabeli po zdefiniowaniu PK
PK SK
USER#<USER_ID>
Użytkownik oraz jego meta dane
Każdy użytkownik posiada dokładnie 1 zestaw metadanych,
posiada jeden login, email, hasło, itp. Dodatkowo, jeśli uda
nam się zaproponować taką parę PK i SK którą będziemy w
stanie skonstruować przy zapytaniu będziemy mogli
pobrać danie zapytaniem GetItem
Tabela pozwalająca pobrać metadane
PK SK name email
USER#<USER_ID>
METADATA Marcin Mazurowski m.mazurowski@tsh.io
Dzięki odpowiedniej konstrukcji PK oraz SK udało nam się
zrealizować access pattern w najefektywniejszy sposób przy
użyciu zapytania GetItem. Nie spoczywajmy jednak na
laurach, mamy jeszcze kilka encji do zamodelowania!
Zrealizowane access patterny
1. Pobranie meta-danych użytkownika (zdjęcie
profilowe, imię, itp)
2. Pobranie przypisanych adresów użytkownika
3. Pobranie wszystkich przesyłek
4. Pobranie konkretnej przesyłki dla użytkownika
5. Pobranie zawartości dla przesyłki
6. Pobranie zdarzeń dla przesyłki
7. Pobranie zdarzeń oraz zawartości danej
przesyłki
8. Pobranie zarchiwizowanych przesyłek
Relacja jeden do wielu pomiędzy użytkownikiem a jego
adresami
W tego typu aplikacji, użytkownicy zazwyczaj mają
możliwość zdefiniowania więcej niż jednego adresu wysyłki
(Np. Dom oraz adres biura). W wypadku możemy skorzystać
z więcej niż jednej strategii:
1. Złożone pole przetrzymujące kilka wartości
2. Jeden element (Item) dla każdego adresu
Każdy element (Item) w DynamoDB jest ograniczony limitem
rozmiaru 400Kb. Limit ten jest jedną z form wymuszania na
deweloperach takiego designu tabeli aby operacje był jak
najbardziej efektywne. Jeśli przyjmiemy zasadę biznesową, że
użytkownik może mieć maksymalnie 3 adresy przypisane do
konta możemy bezpiecznie skorzystać ze strategii pola
złożonego, nie zawsze jednak można przyjąć takie założenie.
Tabela pozwalająca pobrać metadane oraz adresy
PK SK name email addresses
USER#<USER_ID
>
METADATA Marcin
Mazurowski
m.mazurowski@tsh.io {“Home”:{“street”:”ul.
Dolnych Wałów 8”}}
Świetnie!
Dzięki wykorzystaniu strategii pola złożonego, możemy
pobrać adresy dzięki wykorzystaniu zapytania GetItem.
Zrealizowane access patterny
1. Pobranie meta-danych użytkownika (zdjęcie profilowe, imię, itp)
2. Pobranie przypisanych adresów użytkownika
3. Pobranie wszystkich przesyłek
4. Pobranie konkretnej przesyłki dla użytkownika
5. Pobranie zawartości dla przesyłki
6. Pobranie zdarzeń dla przesyłki
7. Pobranie zdarzeń oraz zawartości danej przesyłki
8. Pobranie zarchiwizowanych przesyłek
Relacja jeden do wielu pomiędzy użytkownikiem a przesyłkami
Ten przypadek użycia jest odrobinę ciekawszy niż poprzednie.
Po pierwsze dlatego, że każda przesyłka będzie mogła
zawierać wiele zdarzeń oraz wiele produktów. Odpowiednie
przemyślenie naszego SortKey pozwoli na efektywną
realizację access patternów.
Propozycja uwzględniająca encję Shipment
PK SK <attrybuty>
USER#<US
ER_ID>
METADATA
SHIPMENT#<SHIPMENT_ID>
Pobranie konkretnej przesyłki dla konkretnego
użytkownika
Dzięki konstrukcji SHIPMENT#<SHIPMENT_ID> będziemy w stanie otrzymać
konkretny shipment dla użytkownika przy użyciu operacji GetItem
Zrealizowane access patterny
1. Pobranie meta-danych użytkownika (zdjęcie profilowe, imię, itp)
2. Pobranie przypisanych adresów użytkownika
3. Pobranie wszystkich przesyłek
4. Pobranie konkretnej przesyłki dla użytkownika
5. Pobranie zawartości dla przesyłki
6. Pobranie zdarzeń dla przesyłki
7. Pobranie zdarzeń oraz zawartości danej przesyłki
8. Pobranie zarchiwizowanych przesyłek
Relacja jeden do wielu pomiędzy przesyłką, a jej zawartością
Relacja jeden do wielu pomiędzy przesyłką, a jej zdarzeniami
Propozycja uwzględniająca encję Shipment
PK SK <attrybuty>
USER#<US
ER_ID>
METADATA
SHIPMENT#<SHIPMENT_ID>
SHIPMENT#<SHIPMENT_ID>SHIP_ITEM#<ITEM_ID>
SHIPMENT#<SHIPMENT_ID>EVENT#<EVENT_ID>
Pobranie wszystkich przesyłek wraz ze zdarzeniami oraz
elementami przesyłki dla danego użytkownika
Dzięki takiej konstrukcji będziemy w stanie otrzymać konkretną przesyłkę dla
użytkownika, jej zawartość oraz wszystkie zdarzenia przypisane do przesyłki przy
użyciu operacji Query. Aby osiągnąć ten cel skorzystamy z Key Condition
Expression. A dokładnie BEGINS_WITH = SHIPMENT#<SHIPMENT_ID>
Pobranie wszystkich zdarzeń dla przesyłki
Dzięki konstrukcji PK = SHIPMENT#<SHIPMENT_ID> będziemy w stanie otrzymać konkretną
przesyłkę dla użytkownika oraz wszystkie zdarzenia i elementy przypisane do przesyłki przy użyciu
operacji Query.
Aby osiągnąć ten cel skorzystamy z Key Condition Expression. A dokładnie BEGINS_WITH =
SHIPMENT#<SHIPMENT_ID>EVENT#
Zrealizowane access patterny
1. Pobranie meta-danych użytkownika (zdjęcie profilowe, imię, itp)
2. Pobranie przypisanych adresów użytkownika
3. Pobranie wszystkich przesyłek
4. Pobranie konkretnej przesyłki dla użytkownika
5. Pobranie zawartości dla przesyłki
6. Pobranie zdarzeń dla przesyłki
7. Pobranie zdarzeń oraz zawartości danej przesyłki
8. Pobranie zarchiwizowanych przesyłek
Finalna propozycja głównej tabeli
PK SK <attrybuty>
USER#<US
ER_ID>
METADATA
SHIPMENT#<SHIPMENT_ID>
SHIPMENT#<SHIPMENT_ID>SHIP_ITEM#<ITEM_ID>
SHIPMENT#<SHIPMENT_ID>EVENT#<EVENT_ID>
Global Secondary Index
W niektórych sytuacjach może zdarzyć się, że nie będziemy w
stanie zrealizować naszego access patternu bezpośrednio na
głównej tabeli. Ciekawą strategią do wydzielenia części
większego zbioru rekordów jest zastosowanie GSI oraz
dodanie atrybutu który będzie występował tylko rekordach
danego typu.
Stworzenie atrybutów użytych w GSI do wydzielenia encji po jej
typie
PK SK GSI1PK GSISK
USER#<
USER_I
D>
METADATA
SHIPMENT#<SHIPMENT_ID>
SHIPMENT#<SHIPMENT_ID>SHIP_ITEM#<ITE
M_ID>
USER#1 TYPE#SHIPMENT
SHIPMENT#<SHIPMENT_ID>EVENT#<EVENT_
ID>
Zrealizowane access patterny
1. Pobranie meta-danych użytkownika (zdjęcie profilowe, imię, itp)
2. Pobranie przypisanych adresów użytkownika
3. Pobranie wszystkich przesyłek
4. Pobranie konkretnej przesyłki dla użytkownika
5. Pobranie zawartości dla przesyłki
6. Pobranie zdarzeń dla przesyłki
7. Pobranie zdarzeń oraz zawartości danej przesyłki
8. Pobranie zarchiwizowanych przesyłek
Stworzenie atrybutów użytych w GSI do wydzielenia encji po jej
typie oraz statusie
PK SK GSI1PK GSISK
USER#<
USER_I
D>
METADATA
SHIPMENT#<SHIPMENT_ID>
SHIPMENT#<SHIPMENT_ID>SHIP_ITE
M#<ITEM_ID>
USER#1 TYPE#SHIPMENT#STATUS#ARCHIVED
SHIPMENT#<SHIPMENT_ID>EVENT#<
EVENT_ID>
Przykładowy widok GSI
PK SK Atrybuty
USER#1 TYPE#SHIPMENT#STATUS#ARCHIVED
Podczas tworzenia GSI będziemy mieli możliwość wybrania
atrybutów które zostaną dodane do indeksu.
Dobrą praktyką jest ograniczenie ich tylko do tych z których
rzeczywiście korzystamy. Analogicznie do unikania SELECT *
FROM table
Poprzez złożenie SK w naszym GSI stwarzamy sobie
możliwość do pobrania nie tylko wszystkich przesyłek, ale
również odfiltrowanie ich po ich stanie (aktywna /
zarchiwizowana)
Udało nam się zrealizować wszystkie access patterny! Ale czy
na tym koniec naszej pracy? Prawdopodobnie nie, model aby
w pełni realizować potrzeby biznesu musi ewoluować i z
pewnością tak też będzie się działo. Warto planować access
patterny z różnych perspektyw i dostarczyć sobie
wystarczającą ilość możliwości.
Warto poczytać:
1. https://www.dynamodbguide.com/
2. https://www.alexdebrie.com/
3. https://github.com/alexdebrie/awesome-dynamodb/
4. https://dynobase.dev/dynamodb-tutorials/
Dzięki!
LinkedIn: marcinmazurowski
Mail: marcin.mazurowski@tsh.io

Más contenido relacionado

La actualidad más candente

NOSQL- Presentation on NoSQL
NOSQL- Presentation on NoSQLNOSQL- Presentation on NoSQL
NOSQL- Presentation on NoSQLRamakant Soni
 
DDD Basics - Context mapping
DDD Basics - Context mappingDDD Basics - Context mapping
DDD Basics - Context mappingStijn Volders
 
Data modeling case study
Data modeling case studyData modeling case study
Data modeling case studyminderchen
 
All of the Performance Tuning Features in Oracle SQL Developer
All of the Performance Tuning Features in Oracle SQL DeveloperAll of the Performance Tuning Features in Oracle SQL Developer
All of the Performance Tuning Features in Oracle SQL DeveloperJeff Smith
 
PLPgSqL- Datatypes, Language structure.pptx
PLPgSqL- Datatypes, Language structure.pptxPLPgSqL- Datatypes, Language structure.pptx
PLPgSqL- Datatypes, Language structure.pptxjohnwick814916
 
Object Relational Database Management System
Object Relational Database Management SystemObject Relational Database Management System
Object Relational Database Management SystemAmar Myana
 
How to Use EXAchk Effectively to Manage Exadata Environments
How to Use EXAchk Effectively to Manage Exadata EnvironmentsHow to Use EXAchk Effectively to Manage Exadata Environments
How to Use EXAchk Effectively to Manage Exadata EnvironmentsSandesh Rao
 
Proactive Threat Detection and Safeguarding of Data for Enhanced Cyber resili...
Proactive Threat Detection and Safeguarding of Data for Enhanced Cyber resili...Proactive Threat Detection and Safeguarding of Data for Enhanced Cyber resili...
Proactive Threat Detection and Safeguarding of Data for Enhanced Cyber resili...Sandeep Patil
 
Specificity and CSS Selectors
Specificity and CSS SelectorsSpecificity and CSS Selectors
Specificity and CSS Selectorspalomateach
 
Word2Vec model to generate synonyms on the fly in Apache Lucene.pdf
Word2Vec model to generate synonyms on the fly in Apache Lucene.pdfWord2Vec model to generate synonyms on the fly in Apache Lucene.pdf
Word2Vec model to generate synonyms on the fly in Apache Lucene.pdfSease
 
Presentation of bootstrap
Presentation of bootstrapPresentation of bootstrap
Presentation of bootstrap1amitgupta
 
Automate That! Scripting Atlassian applications in Python
Automate That! Scripting Atlassian applications in PythonAutomate That! Scripting Atlassian applications in Python
Automate That! Scripting Atlassian applications in PythonAtlassian
 
Les 05 Create Bu
Les 05 Create BuLes 05 Create Bu
Les 05 Create Buvivaankumar
 
Linux and Java - Understanding and Troubleshooting
Linux and Java - Understanding and TroubleshootingLinux and Java - Understanding and Troubleshooting
Linux and Java - Understanding and TroubleshootingJérôme Kehrli
 

La actualidad más candente (20)

Pydata-Python tools for webscraping
Pydata-Python tools for webscrapingPydata-Python tools for webscraping
Pydata-Python tools for webscraping
 
NOSQL- Presentation on NoSQL
NOSQL- Presentation on NoSQLNOSQL- Presentation on NoSQL
NOSQL- Presentation on NoSQL
 
DDD Basics - Context mapping
DDD Basics - Context mappingDDD Basics - Context mapping
DDD Basics - Context mapping
 
Data modeling case study
Data modeling case studyData modeling case study
Data modeling case study
 
All of the Performance Tuning Features in Oracle SQL Developer
All of the Performance Tuning Features in Oracle SQL DeveloperAll of the Performance Tuning Features in Oracle SQL Developer
All of the Performance Tuning Features in Oracle SQL Developer
 
PLPgSqL- Datatypes, Language structure.pptx
PLPgSqL- Datatypes, Language structure.pptxPLPgSqL- Datatypes, Language structure.pptx
PLPgSqL- Datatypes, Language structure.pptx
 
Sql server basics
Sql server basicsSql server basics
Sql server basics
 
Object Relational Database Management System
Object Relational Database Management SystemObject Relational Database Management System
Object Relational Database Management System
 
Bootstrap 5 ppt
Bootstrap 5 pptBootstrap 5 ppt
Bootstrap 5 ppt
 
How to Use EXAchk Effectively to Manage Exadata Environments
How to Use EXAchk Effectively to Manage Exadata EnvironmentsHow to Use EXAchk Effectively to Manage Exadata Environments
How to Use EXAchk Effectively to Manage Exadata Environments
 
Proactive Threat Detection and Safeguarding of Data for Enhanced Cyber resili...
Proactive Threat Detection and Safeguarding of Data for Enhanced Cyber resili...Proactive Threat Detection and Safeguarding of Data for Enhanced Cyber resili...
Proactive Threat Detection and Safeguarding of Data for Enhanced Cyber resili...
 
Specificity and CSS Selectors
Specificity and CSS SelectorsSpecificity and CSS Selectors
Specificity and CSS Selectors
 
Database concepts
Database conceptsDatabase concepts
Database concepts
 
Word2Vec model to generate synonyms on the fly in Apache Lucene.pdf
Word2Vec model to generate synonyms on the fly in Apache Lucene.pdfWord2Vec model to generate synonyms on the fly in Apache Lucene.pdf
Word2Vec model to generate synonyms on the fly in Apache Lucene.pdf
 
Presentation of bootstrap
Presentation of bootstrapPresentation of bootstrap
Presentation of bootstrap
 
Js ppt
Js pptJs ppt
Js ppt
 
Automate That! Scripting Atlassian applications in Python
Automate That! Scripting Atlassian applications in PythonAutomate That! Scripting Atlassian applications in Python
Automate That! Scripting Atlassian applications in Python
 
Les 05 Create Bu
Les 05 Create BuLes 05 Create Bu
Les 05 Create Bu
 
Linux and Java - Understanding and Troubleshooting
Linux and Java - Understanding and TroubleshootingLinux and Java - Understanding and Troubleshooting
Linux and Java - Understanding and Troubleshooting
 
Introduction to MongoDB
Introduction to MongoDBIntroduction to MongoDB
Introduction to MongoDB
 

Similar a DynamoDB – podstawy modelowania danych dla opornych

10. Analizowanie potrzeb klienta i projektowanie struktury baz danych
10. Analizowanie potrzeb klienta i projektowanie struktury baz danych10. Analizowanie potrzeb klienta i projektowanie struktury baz danych
10. Analizowanie potrzeb klienta i projektowanie struktury baz danychkalaxq
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Cloudskraqa
 
Migracja I Integracja Bazy
Migracja I Integracja BazyMigracja I Integracja Bazy
Migracja I Integracja BazyPrzemysław ...
 
[#4] spark - IBM Integrated Analytics System
[#4] spark - IBM Integrated Analytics System[#4] spark - IBM Integrated Analytics System
[#4] spark - IBM Integrated Analytics SystemArtur Wronski
 
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbaćBartosz Ratajczyk
 
Using Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentationUsing Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentationMariusz Koprowski
 
Microsoft Business Intelligence w 2017 roku
Microsoft Business Intelligence w 2017 rokuMicrosoft Business Intelligence w 2017 roku
Microsoft Business Intelligence w 2017 rokuHighWheelSoftware
 
Testowanie bezpieczenstwa aplikacji mobilnych
Testowanie bezpieczenstwa aplikacji mobilnychTestowanie bezpieczenstwa aplikacji mobilnych
Testowanie bezpieczenstwa aplikacji mobilnychSecuRing
 
Optymalizacja pracy front-end developera
Optymalizacja pracy front-end developeraOptymalizacja pracy front-end developera
Optymalizacja pracy front-end developeraSzymon Kadzielawa
 
SCAP – standaryzacja formatów wymiany danych w zakresie bezpieczeństwa IT
SCAP – standaryzacja formatów wymiany danych w zakresie bezpieczeństwa ITSCAP – standaryzacja formatów wymiany danych w zakresie bezpieczeństwa IT
SCAP – standaryzacja formatów wymiany danych w zakresie bezpieczeństwa ITRedge Technologies
 
Pocałunek śmierci
Pocałunek śmierciPocałunek śmierci
Pocałunek śmierciDivante
 
Access 2003 PL. Ćwiczenia praktyczne
Access 2003 PL. Ćwiczenia praktyczneAccess 2003 PL. Ćwiczenia praktyczne
Access 2003 PL. Ćwiczenia praktyczneWydawnictwo Helion
 
20160316 techstolica - cloudanalytics -tidk
20160316  techstolica - cloudanalytics -tidk20160316  techstolica - cloudanalytics -tidk
20160316 techstolica - cloudanalytics -tidkŁukasz Grala
 
Optymalizacja pracy front-end developera
Optymalizacja pracy front-end developeraOptymalizacja pracy front-end developera
Optymalizacja pracy front-end developeraWordCamp Polska
 
Access 2007 PL. Ćwiczenia praktyczne
Access 2007 PL. Ćwiczenia praktyczneAccess 2007 PL. Ćwiczenia praktyczne
Access 2007 PL. Ćwiczenia praktyczneWydawnictwo Helion
 

Similar a DynamoDB – podstawy modelowania danych dla opornych (20)

10. Analizowanie potrzeb klienta i projektowanie struktury baz danych
10. Analizowanie potrzeb klienta i projektowanie struktury baz danych10. Analizowanie potrzeb klienta i projektowanie struktury baz danych
10. Analizowanie potrzeb klienta i projektowanie struktury baz danych
 
Michał Dec - Quality in Clouds
Michał Dec - Quality in CloudsMichał Dec - Quality in Clouds
Michał Dec - Quality in Clouds
 
Migracja I Integracja Bazy
Migracja I Integracja BazyMigracja I Integracja Bazy
Migracja I Integracja Bazy
 
Mongodb with Rails
Mongodb with RailsMongodb with Rails
Mongodb with Rails
 
[#4] spark - IBM Integrated Analytics System
[#4] spark - IBM Integrated Analytics System[#4] spark - IBM Integrated Analytics System
[#4] spark - IBM Integrated Analytics System
 
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
"Administrator z przypadku" - Jak działa SQL Server i jak o niego dbać
 
Using Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentationUsing Red Gate SQL Doc for database documentation
Using Red Gate SQL Doc for database documentation
 
Microsoft Business Intelligence w 2017 roku
Microsoft Business Intelligence w 2017 rokuMicrosoft Business Intelligence w 2017 roku
Microsoft Business Intelligence w 2017 roku
 
Testowanie bezpieczenstwa aplikacji mobilnych
Testowanie bezpieczenstwa aplikacji mobilnychTestowanie bezpieczenstwa aplikacji mobilnych
Testowanie bezpieczenstwa aplikacji mobilnych
 
Optymalizacja pracy front-end developera
Optymalizacja pracy front-end developeraOptymalizacja pracy front-end developera
Optymalizacja pracy front-end developera
 
SCAP – standaryzacja formatów wymiany danych w zakresie bezpieczeństwa IT
SCAP – standaryzacja formatów wymiany danych w zakresie bezpieczeństwa ITSCAP – standaryzacja formatów wymiany danych w zakresie bezpieczeństwa IT
SCAP – standaryzacja formatów wymiany danych w zakresie bezpieczeństwa IT
 
Pocałunek śmierci
Pocałunek śmierciPocałunek śmierci
Pocałunek śmierci
 
SOLIDWORKS system 3d cad
SOLIDWORKS system 3d cadSOLIDWORKS system 3d cad
SOLIDWORKS system 3d cad
 
Cwac23 4
Cwac23 4Cwac23 4
Cwac23 4
 
Access 2003 PL. Ćwiczenia praktyczne
Access 2003 PL. Ćwiczenia praktyczneAccess 2003 PL. Ćwiczenia praktyczne
Access 2003 PL. Ćwiczenia praktyczne
 
20160316 techstolica - cloudanalytics -tidk
20160316  techstolica - cloudanalytics -tidk20160316  techstolica - cloudanalytics -tidk
20160316 techstolica - cloudanalytics -tidk
 
Optymalizacja pracy front-end developera
Optymalizacja pracy front-end developeraOptymalizacja pracy front-end developera
Optymalizacja pracy front-end developera
 
MongoDB 2011
MongoDB 2011MongoDB 2011
MongoDB 2011
 
Access 2007 PL. Ćwiczenia praktyczne
Access 2007 PL. Ćwiczenia praktyczneAccess 2007 PL. Ćwiczenia praktyczne
Access 2007 PL. Ćwiczenia praktyczne
 
test
testtest
test
 

Más de The Software House

Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...The Software House
 
Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?The Software House
 
O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?The Software House
 
Chat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeChat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeThe Software House
 
Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?The Software House
 
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSAnaliza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSThe Software House
 
Feature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptFeature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptThe Software House
 
Typowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptTypowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptThe Software House
 
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLAutomatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLThe Software House
 
Serverless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychServerless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychThe Software House
 
Testy API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciTesty API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciThe Software House
 
Jak skutecznie read model. Case study
Jak skutecznie read model. Case studyJak skutecznie read model. Case study
Jak skutecznie read model. Case studyThe Software House
 
Firestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejFirestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejThe Software House
 
Jak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachJak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachThe Software House
 
O łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsO łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsThe Software House
 
Amazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeAmazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeThe Software House
 
Od Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduOd Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduThe Software House
 

Más de The Software House (20)

Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
Jak kraść miliony, czyli o błędach bezpieczeństwa, które mogą spotkać również...
 
Uszanowanko Podsumowanko
Uszanowanko PodsumowankoUszanowanko Podsumowanko
Uszanowanko Podsumowanko
 
Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?Jak efektywnie podejść do certyfikacji w AWS?
Jak efektywnie podejść do certyfikacji w AWS?
 
O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?O co chodzi z tą dostępnością cyfrową?
O co chodzi z tą dostępnością cyfrową?
 
Chat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon ChimeChat tekstowy z użyciem Amazon Chime
Chat tekstowy z użyciem Amazon Chime
 
Migracje danych serverless
Migracje danych serverlessMigracje danych serverless
Migracje danych serverless
 
Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?Jak nie zwariować z architekturą Serverless?
Jak nie zwariować z architekturą Serverless?
 
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWSAnaliza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
Analiza semantyczna artykułów prasowych w 5 sprintów z użyciem AWS
 
Feature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScriptFeature flags na ratunek projektu w JavaScript
Feature flags na ratunek projektu w JavaScript
 
Typowanie nominalne w TypeScript
Typowanie nominalne w TypeScriptTypowanie nominalne w TypeScript
Typowanie nominalne w TypeScript
 
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQLAutomatyzacja tworzenia frontendu z wykorzystaniem GraphQL
Automatyzacja tworzenia frontendu z wykorzystaniem GraphQL
 
Serverless Compose vs hurtownia danych
Serverless Compose vs hurtownia danychServerless Compose vs hurtownia danych
Serverless Compose vs hurtownia danych
 
Testy API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięciTesty API: połączenie z bazą danych czy implementacja w pamięci
Testy API: połączenie z bazą danych czy implementacja w pamięci
 
Jak skutecznie read model. Case study
Jak skutecznie read model. Case studyJak skutecznie read model. Case study
Jak skutecznie read model. Case study
 
Firestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny KrzemowejFirestore czyli ognista baza od giganta z Doliny Krzemowej
Firestore czyli ognista baza od giganta z Doliny Krzemowej
 
Jak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzachJak utrzymać stado Lambd w ryzach
Jak utrzymać stado Lambd w ryzach
 
Jak poskromić AWS?
Jak poskromić AWS?Jak poskromić AWS?
Jak poskromić AWS?
 
O łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.jsO łączeniu Storyblok i Next.js
O łączeniu Storyblok i Next.js
 
Amazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurzeAmazon Step Functions. Sposób na implementację procesów w chmurze
Amazon Step Functions. Sposób na implementację procesów w chmurze
 
Od Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki koduOd Figmy do gotowej aplikacji bez linijki kodu
Od Figmy do gotowej aplikacji bez linijki kodu
 

DynamoDB – podstawy modelowania danych dla opornych

  • 1. Modelowanie danych w DynamoDB Single Table Design, efektywnie skalowalna warstwa persystencji
  • 2. $ whoami Senior Node.js Developer Serverless & DynamoDB = ❤
  • 4. Baza danych która powstała z miłości
  • 6. “Amazon DynamoDB is a fully managed, serverless, key-value NoSQL database designed to run high-performance applications at any scale. DynamoDB offers built-in security, continuous backups, automated multi-region replication, in-memory caching, and data export tools.” https://aws.amazon.com/dynamodb/
  • 7. “Amazon DynamoDB is a fully managed, serverless, key-value NoSQL database designed to run high-performance applications at any scale. DynamoDB offers built-in security, continuous backups, automated multi-region replication, in-memory caching, and data export tools.” https://aws.amazon.com/dynamodb/
  • 8. “Amazon DynamoDB is a fully managed, serverless, key-value NoSQL database designed to run high-performance applications at any scale. DynamoDB offers built-in security, continuous backups, automated multi-region replication, in-memory caching, and data export tools.” https://aws.amazon.com/dynamodb/
  • 9. “Amazon DynamoDB is a fully managed, serverless, key-value NoSQL database designed to run high-performance applications at any scale. DynamoDB offers built-in security, continuous backups, automated multi-region replication, in-memory caching, and data export tools.” https://aws.amazon.com/dynamodb/
  • 11. Co się dzieje z RDSem przy pewnej skali...
  • 12.
  • 14. Model konsumpcji danych uległ gwałtownej zmianie. Systemy IT przestały być domeną wielkich korporacji, banków czy instytucji rządowych. Dostęp do internetu, gwałtownie rosnąca ilość urządzeń oraz ewolucja biznesu wymusza na nas o wiele większy i szybszy przepływ danych.
  • 15. Dlaczego DynamoDB oferuje większą wydajność niż baza relacyjna?
  • 16. Relacyjne bazy danych są zoptymalizowane do przechowywania, wynika to z historycznie wysokiego kosztu pamięci, a relatywnie niskiego kosztu CPU w czasach kiedy bazy relacyjne powstawały.
  • 17. DynamoDB jest zoptymalizowane do szybkiego odczytu. Ze względu na odwrócenie trendu pomiędzy kosztem pamięci a kosztem CPU, bardziej optymalnym podejściem jest zmniejszenie kosztu “złożenia” danych, nawet jeśli odbywa się to kosztem konsumowanej pamięci.
  • 18. Co gdybyśmy mogli trzymać wszystkie encje w jednej tabeli?
  • 19. Co więcej, dostać się do niezbędnych encji przy użyciu jednego zapytania?
  • 20.
  • 21. Odpowiedzią na powyższe pytania jest Single Table Design!
  • 23. 1. Kartka i papier (lub dowolny soft do tworzenia diagramów).
  • 24. 1. Kartka i papier (lub dowolny soft do tworzenia diagramów). 2. NoSQL WorkBench
  • 25. 1. Kartka i papier (lub dowolny soft do tworzenia diagramów). 2. NoSQL WorkBench 3. Konto AWS
  • 27.
  • 30. 1. Zrozumienie potrzeb aplikacji 2. Stworzenie uproszczonego ERD
  • 31. 1. Zrozumienie potrzeb aplikacji 2. Stworzenie uproszczonego ERD 3. Stworzenie access patternów
  • 32. 1. Zrozumienie potrzeb aplikacji 2. Stworzenie uproszczonego ERD 3. Stworzenie access patternów 4. <tajny składnik nr 1>
  • 33. 1. Zrozumienie potrzeb aplikacji 2. Stworzenie uproszczonego ERD 3. Stworzenie access patternów 4. <tajny składnik nr 1> 5. <tajny składnik nr 2>
  • 37. Główną wartością dostarczaną przez aplikację jest możliwość śledzenia zamówionych przesyłek.
  • 38. Jako użytkownik, chcę mieć możliwość poznać status mojej przesyłki.
  • 39. Jako użytkownik chcę móc nadać przyjazną nazwę przesyłki
  • 40. Jako użytkownik chcę wiedzieć kiedy archiwalna przesyłka została dostarczona
  • 41. Jako użytkownik chcę móc zmienić swoje dane w profilu (dark-mode, email do powiadomień, itp.)
  • 42. 1. Zrozumienie potrzeb aplikacji 2. Stworzenie uproszczonego ERD
  • 43.
  • 44. 1. Zrozumienie potrzeb aplikacji 2. Stworzenie uproszczonego ERD 3. Stworzenie access patternów
  • 45. 1. Zrozumienie potrzeb aplikacji 2. Stworzenie uproszczonego ERD 3. Stworzenie access patternów 4. Stworzenie access patternów
  • 46. 1. Zrozumienie potrzeb aplikacji 2. Stworzenie uproszczonego ERD 3. Stworzenie access patternów 4. Stworzenie access patternów 5. Stworzenie access patternów
  • 47.
  • 48. 1. Pobranie meta-danych użytkownika (zdjęcie profilowe, imię, itp)
  • 49. 1. Pobranie meta-danych użytkownika (zdjęcie profilowe, imię, itp) 2. Pobranie przypisanych adresów użytkownika
  • 50. 1. Pobranie meta-danych użytkownika (zdjęcie profilowe, imię, itp) 2. Pobranie przypisanych adresów użytkownika 3. Pobranie wszystkich przesyłek
  • 51. 1. Pobranie meta-danych użytkownika (zdjęcie profilowe, imię, itp) 2. Pobranie przypisanych adresów użytkownika 3. Pobranie wszystkich przesyłek 4. Pobranie zawartości dla przesyłki
  • 52. 1. Pobranie meta-danych użytkownika (zdjęcie profilowe, imię, itp) 2. Pobranie przypisanych adresów użytkownika 3. Pobranie wszystkich przesyłek 4. Pobranie zawartości dla przesyłki 5. Pobranie zdarzeń dla przesyłki
  • 53. 1. Pobranie meta-danych użytkownika (zdjęcie profilowe, imię, itp) 2. Pobranie przypisanych adresów użytkownika 3. Pobranie wszystkich przesyłek 4. Pobranie zawartości dla przesyłki 5. Pobranie zdarzeń dla przesyłki 6. Pobranie zdarzeń oraz zawartości danej przesyłki
  • 54. 1. Pobranie meta-danych użytkownika (zdjęcie profilowe, imię, itp) 2. Pobranie przypisanych adresów użytkownika 3. Pobranie wszystkich przesyłek 4. Pobranie zawartości dla przesyłki 5. Pobranie zdarzeń dla przesyłki 6. Pobranie zdarzeń oraz zawartości danej przesyłki 7. Pobranie zarchiwizowanych przesyłek
  • 55. Najważniejszym krokiem przy modelowaniu jest wybór odpowiedniego PK oraz SK!
  • 56. Rozpoczynamy modelowanie od “korzenia”
  • 57.
  • 58. Z diagramu relacji encji, możemy zauważyć, że naszą główną encją z której relacje wychodzą na zewnątrz jest User. Na podstawie tego, rozsądnym będzie przyjąć, że Partition Key będzie związany z użytkownikiem. W związku z tym proponuję przyjąć następujący kształt Partition Key USER#<USER_ID>
  • 59. Kształt tabeli po zdefiniowaniu PK PK SK USER#<USER_ID>
  • 61. Każdy użytkownik posiada dokładnie 1 zestaw metadanych, posiada jeden login, email, hasło, itp. Dodatkowo, jeśli uda nam się zaproponować taką parę PK i SK którą będziemy w stanie skonstruować przy zapytaniu będziemy mogli pobrać danie zapytaniem GetItem
  • 62. Tabela pozwalająca pobrać metadane PK SK name email USER#<USER_ID> METADATA Marcin Mazurowski m.mazurowski@tsh.io
  • 63. Dzięki odpowiedniej konstrukcji PK oraz SK udało nam się zrealizować access pattern w najefektywniejszy sposób przy użyciu zapytania GetItem. Nie spoczywajmy jednak na laurach, mamy jeszcze kilka encji do zamodelowania!
  • 64. Zrealizowane access patterny 1. Pobranie meta-danych użytkownika (zdjęcie profilowe, imię, itp) 2. Pobranie przypisanych adresów użytkownika 3. Pobranie wszystkich przesyłek 4. Pobranie konkretnej przesyłki dla użytkownika 5. Pobranie zawartości dla przesyłki 6. Pobranie zdarzeń dla przesyłki 7. Pobranie zdarzeń oraz zawartości danej przesyłki 8. Pobranie zarchiwizowanych przesyłek
  • 65. Relacja jeden do wielu pomiędzy użytkownikiem a jego adresami
  • 66. W tego typu aplikacji, użytkownicy zazwyczaj mają możliwość zdefiniowania więcej niż jednego adresu wysyłki (Np. Dom oraz adres biura). W wypadku możemy skorzystać z więcej niż jednej strategii: 1. Złożone pole przetrzymujące kilka wartości 2. Jeden element (Item) dla każdego adresu
  • 67. Każdy element (Item) w DynamoDB jest ograniczony limitem rozmiaru 400Kb. Limit ten jest jedną z form wymuszania na deweloperach takiego designu tabeli aby operacje był jak najbardziej efektywne. Jeśli przyjmiemy zasadę biznesową, że użytkownik może mieć maksymalnie 3 adresy przypisane do konta możemy bezpiecznie skorzystać ze strategii pola złożonego, nie zawsze jednak można przyjąć takie założenie.
  • 68. Tabela pozwalająca pobrać metadane oraz adresy PK SK name email addresses USER#<USER_ID > METADATA Marcin Mazurowski m.mazurowski@tsh.io {“Home”:{“street”:”ul. Dolnych Wałów 8”}}
  • 69. Świetnie! Dzięki wykorzystaniu strategii pola złożonego, możemy pobrać adresy dzięki wykorzystaniu zapytania GetItem.
  • 70. Zrealizowane access patterny 1. Pobranie meta-danych użytkownika (zdjęcie profilowe, imię, itp) 2. Pobranie przypisanych adresów użytkownika 3. Pobranie wszystkich przesyłek 4. Pobranie konkretnej przesyłki dla użytkownika 5. Pobranie zawartości dla przesyłki 6. Pobranie zdarzeń dla przesyłki 7. Pobranie zdarzeń oraz zawartości danej przesyłki 8. Pobranie zarchiwizowanych przesyłek
  • 71. Relacja jeden do wielu pomiędzy użytkownikiem a przesyłkami
  • 72. Ten przypadek użycia jest odrobinę ciekawszy niż poprzednie. Po pierwsze dlatego, że każda przesyłka będzie mogła zawierać wiele zdarzeń oraz wiele produktów. Odpowiednie przemyślenie naszego SortKey pozwoli na efektywną realizację access patternów.
  • 73. Propozycja uwzględniająca encję Shipment PK SK <attrybuty> USER#<US ER_ID> METADATA SHIPMENT#<SHIPMENT_ID>
  • 74. Pobranie konkretnej przesyłki dla konkretnego użytkownika Dzięki konstrukcji SHIPMENT#<SHIPMENT_ID> będziemy w stanie otrzymać konkretny shipment dla użytkownika przy użyciu operacji GetItem
  • 75. Zrealizowane access patterny 1. Pobranie meta-danych użytkownika (zdjęcie profilowe, imię, itp) 2. Pobranie przypisanych adresów użytkownika 3. Pobranie wszystkich przesyłek 4. Pobranie konkretnej przesyłki dla użytkownika 5. Pobranie zawartości dla przesyłki 6. Pobranie zdarzeń dla przesyłki 7. Pobranie zdarzeń oraz zawartości danej przesyłki 8. Pobranie zarchiwizowanych przesyłek
  • 76. Relacja jeden do wielu pomiędzy przesyłką, a jej zawartością
  • 77. Relacja jeden do wielu pomiędzy przesyłką, a jej zdarzeniami
  • 78. Propozycja uwzględniająca encję Shipment PK SK <attrybuty> USER#<US ER_ID> METADATA SHIPMENT#<SHIPMENT_ID> SHIPMENT#<SHIPMENT_ID>SHIP_ITEM#<ITEM_ID> SHIPMENT#<SHIPMENT_ID>EVENT#<EVENT_ID>
  • 79. Pobranie wszystkich przesyłek wraz ze zdarzeniami oraz elementami przesyłki dla danego użytkownika Dzięki takiej konstrukcji będziemy w stanie otrzymać konkretną przesyłkę dla użytkownika, jej zawartość oraz wszystkie zdarzenia przypisane do przesyłki przy użyciu operacji Query. Aby osiągnąć ten cel skorzystamy z Key Condition Expression. A dokładnie BEGINS_WITH = SHIPMENT#<SHIPMENT_ID>
  • 80. Pobranie wszystkich zdarzeń dla przesyłki Dzięki konstrukcji PK = SHIPMENT#<SHIPMENT_ID> będziemy w stanie otrzymać konkretną przesyłkę dla użytkownika oraz wszystkie zdarzenia i elementy przypisane do przesyłki przy użyciu operacji Query. Aby osiągnąć ten cel skorzystamy z Key Condition Expression. A dokładnie BEGINS_WITH = SHIPMENT#<SHIPMENT_ID>EVENT#
  • 81. Zrealizowane access patterny 1. Pobranie meta-danych użytkownika (zdjęcie profilowe, imię, itp) 2. Pobranie przypisanych adresów użytkownika 3. Pobranie wszystkich przesyłek 4. Pobranie konkretnej przesyłki dla użytkownika 5. Pobranie zawartości dla przesyłki 6. Pobranie zdarzeń dla przesyłki 7. Pobranie zdarzeń oraz zawartości danej przesyłki 8. Pobranie zarchiwizowanych przesyłek
  • 82. Finalna propozycja głównej tabeli PK SK <attrybuty> USER#<US ER_ID> METADATA SHIPMENT#<SHIPMENT_ID> SHIPMENT#<SHIPMENT_ID>SHIP_ITEM#<ITEM_ID> SHIPMENT#<SHIPMENT_ID>EVENT#<EVENT_ID>
  • 84. W niektórych sytuacjach może zdarzyć się, że nie będziemy w stanie zrealizować naszego access patternu bezpośrednio na głównej tabeli. Ciekawą strategią do wydzielenia części większego zbioru rekordów jest zastosowanie GSI oraz dodanie atrybutu który będzie występował tylko rekordach danego typu.
  • 85. Stworzenie atrybutów użytych w GSI do wydzielenia encji po jej typie PK SK GSI1PK GSISK USER#< USER_I D> METADATA SHIPMENT#<SHIPMENT_ID> SHIPMENT#<SHIPMENT_ID>SHIP_ITEM#<ITE M_ID> USER#1 TYPE#SHIPMENT SHIPMENT#<SHIPMENT_ID>EVENT#<EVENT_ ID>
  • 86. Zrealizowane access patterny 1. Pobranie meta-danych użytkownika (zdjęcie profilowe, imię, itp) 2. Pobranie przypisanych adresów użytkownika 3. Pobranie wszystkich przesyłek 4. Pobranie konkretnej przesyłki dla użytkownika 5. Pobranie zawartości dla przesyłki 6. Pobranie zdarzeń dla przesyłki 7. Pobranie zdarzeń oraz zawartości danej przesyłki 8. Pobranie zarchiwizowanych przesyłek
  • 87. Stworzenie atrybutów użytych w GSI do wydzielenia encji po jej typie oraz statusie PK SK GSI1PK GSISK USER#< USER_I D> METADATA SHIPMENT#<SHIPMENT_ID> SHIPMENT#<SHIPMENT_ID>SHIP_ITE M#<ITEM_ID> USER#1 TYPE#SHIPMENT#STATUS#ARCHIVED SHIPMENT#<SHIPMENT_ID>EVENT#< EVENT_ID>
  • 88. Przykładowy widok GSI PK SK Atrybuty USER#1 TYPE#SHIPMENT#STATUS#ARCHIVED
  • 89. Podczas tworzenia GSI będziemy mieli możliwość wybrania atrybutów które zostaną dodane do indeksu. Dobrą praktyką jest ograniczenie ich tylko do tych z których rzeczywiście korzystamy. Analogicznie do unikania SELECT * FROM table
  • 90. Poprzez złożenie SK w naszym GSI stwarzamy sobie możliwość do pobrania nie tylko wszystkich przesyłek, ale również odfiltrowanie ich po ich stanie (aktywna / zarchiwizowana)
  • 91. Udało nam się zrealizować wszystkie access patterny! Ale czy na tym koniec naszej pracy? Prawdopodobnie nie, model aby w pełni realizować potrzeby biznesu musi ewoluować i z pewnością tak też będzie się działo. Warto planować access patterny z różnych perspektyw i dostarczyć sobie wystarczającą ilość możliwości.
  • 92. Warto poczytać: 1. https://www.dynamodbguide.com/ 2. https://www.alexdebrie.com/ 3. https://github.com/alexdebrie/awesome-dynamodb/ 4. https://dynobase.dev/dynamodb-tutorials/