SlideShare ist ein Scribd-Unternehmen logo
1 von 12
Downloaden Sie, um offline zu lesen
Nejlepší cache
je žádná cache
@ProchazkaFilip
1+N
M*N
Relační schéma
a normální formy relací
Nenormalizované relace
- duplikace informací
- složité udržování konzistence, pokud je takové schéma “source of truth”
- updatnout kategorii student znamená updatnout 2 řádky
person_id person_name category_id category_name
1 Karel 1 Student
2 Milan 1 Student
3 Franta 2 Učitel
Normalizované relace
- každá informace je v db jen jednou
- snadné editace/mazání a úpravy schématu
- 3NF je perfektní na ukládání relačních dat
Ale...
- u složitých relací s hodně JOINy mají db problém
- problém se zhoršuje s narůstajícím množstvím dat
- nejde vyřešit výměnou db (MySQL vs PostgreSQL)
- ORM lazy loading
id name
1 Karel
2 Milan
3 Franta
id name
1 Student
2 Učitel
person_id category_id
1 1
2 1
3 2
Cachováním pomalých dotazů
řešíte důsledek, nikoliv příčinu
Denormalizace
máme normalizované relace
a vědomě z nich vytváříme nenormalizované
Proč denormalizace?
čtení a filtrování nenormalizovaných relací je rychlejší
Jak denormalizovat
- vytvoření “view” tabulky v současné db
- triggery
- plnění z modelu, při změně dat
- cronjob / rabbitmq worker
- materializovaný pohled
- o synchronizaci se stará databáze
- úplně jiná databáze
- například ElasticSearch
- plnění z modelu, při změně dat
- cronjob / rabbitmq worker
Case-study použití ElasticSearch
- na Rohlik.cz se kategorie “čerstvé” načítala ~15 vteřin
- personalizace => nemožnost použít cache
- přenesením logiky filtrování jsme se dostali pod ~4 vteřiny
- ES data vyfiltroval a vrátil list IDček
- o hydrataci z MySQL se starala Doctrine
- zahozením hydratace produktů jsme se dostali na ~1 vteřinu
- z ES se získávaly celé dokumenty
- ty se obalily do Value Objectů bez mapování properties
- stejné rozhranní
- bez nutnosti měnit šablony
- stále otřesně pomalé, ale už né kvůli výpisu produktů
Command Query
Responsibility Segregation
efektivní read z ElasticSearche v samostatném modelu
modifikace dat přes Doctrine nad relační db v samostatném modelu
http://martinfowler.com/bliki/CQRS.html
Díky za pozornost!
Dotazy?
@ProchazkaFilip

Weitere ähnliche Inhalte

Andere mochten auch

Αναλφαβητισμός - Κείμενα
Αναλφαβητισμός - Κείμενα Αναλφαβητισμός - Κείμενα
Αναλφαβητισμός - Κείμενα drallis
 
Building the Dreadnought, APM Programme Management SIG Conference 2017, 02 Ma...
Building the Dreadnought, APM Programme Management SIG Conference 2017, 02 Ma...Building the Dreadnought, APM Programme Management SIG Conference 2017, 02 Ma...
Building the Dreadnought, APM Programme Management SIG Conference 2017, 02 Ma...Association for Project Management
 
Understanding the Marketing Technology Landscape
Understanding the Marketing Technology LandscapeUnderstanding the Marketing Technology Landscape
Understanding the Marketing Technology LandscapeMichael Krigsman
 

Andere mochten auch (6)

Data Collection and Diagnosis
Data Collection and DiagnosisData Collection and Diagnosis
Data Collection and Diagnosis
 
Αναλφαβητισμός - Κείμενα
Αναλφαβητισμός - Κείμενα Αναλφαβητισμός - Κείμενα
Αναλφαβητισμός - Κείμενα
 
Building the Dreadnought, APM Programme Management SIG Conference 2017, 02 Ma...
Building the Dreadnought, APM Programme Management SIG Conference 2017, 02 Ma...Building the Dreadnought, APM Programme Management SIG Conference 2017, 02 Ma...
Building the Dreadnought, APM Programme Management SIG Conference 2017, 02 Ma...
 
Financial planning
Financial planningFinancial planning
Financial planning
 
CQRS v rohlik.cz
CQRS v rohlik.czCQRS v rohlik.cz
CQRS v rohlik.cz
 
Understanding the Marketing Technology Landscape
Understanding the Marketing Technology LandscapeUnderstanding the Marketing Technology Landscape
Understanding the Marketing Technology Landscape
 

Mehr von Filip Procházka

Před čím vás Nette ani Symfony neochrání
Před čím vás Nette ani Symfony neochráníPřed čím vás Nette ani Symfony neochrání
Před čím vás Nette ani Symfony neochráníFilip Procházka
 
Doctrine: co dělat, když entity nestačí
Doctrine: co dělat, když entity nestačíDoctrine: co dělat, když entity nestačí
Doctrine: co dělat, když entity nestačíFilip Procházka
 
Nette framework - How to compile an extensible di container
Nette framework - How to compile an extensible di containerNette framework - How to compile an extensible di container
Nette framework - How to compile an extensible di containerFilip Procházka
 
Dependency injection v Nette 2.1 prakticky
Dependency injection v Nette 2.1 praktickyDependency injection v Nette 2.1 prakticky
Dependency injection v Nette 2.1 praktickyFilip Procházka
 
Usnadněte si soužití s Doctrine
Usnadněte si soužití s DoctrineUsnadněte si soužití s Doctrine
Usnadněte si soužití s DoctrineFilip Procházka
 

Mehr von Filip Procházka (14)

4 roky remote
4 roky remote4 roky remote
4 roky remote
 
Před čím vás Nette ani Symfony neochrání
Před čím vás Nette ani Symfony neochráníPřed čím vás Nette ani Symfony neochrání
Před čím vás Nette ani Symfony neochrání
 
Doctrine: co dělat, když entity nestačí
Doctrine: co dělat, když entity nestačíDoctrine: co dělat, když entity nestačí
Doctrine: co dělat, když entity nestačí
 
Testování prakticky
Testování praktickyTestování prakticky
Testování prakticky
 
Doctrine ORM & model
Doctrine ORM & modelDoctrine ORM & model
Doctrine ORM & model
 
Nette framework - How to compile an extensible di container
Nette framework - How to compile an extensible di containerNette framework - How to compile an extensible di container
Nette framework - How to compile an extensible di container
 
Kdyby/Translation
Kdyby/TranslationKdyby/Translation
Kdyby/Translation
 
Kdyby/Events #posobota
Kdyby/Events #posobotaKdyby/Events #posobota
Kdyby/Events #posobota
 
Kdyby/Events
Kdyby/EventsKdyby/Events
Kdyby/Events
 
Kdyby/Redis
Kdyby/RedisKdyby/Redis
Kdyby/Redis
 
Dependency injection v Nette 2.1 prakticky
Dependency injection v Nette 2.1 praktickyDependency injection v Nette 2.1 prakticky
Dependency injection v Nette 2.1 prakticky
 
Usnadněte si soužití s Doctrine
Usnadněte si soužití s DoctrineUsnadněte si soužití s Doctrine
Usnadněte si soužití s Doctrine
 
Nette Tester / Posobota
Nette Tester / PosobotaNette Tester / Posobota
Nette Tester / Posobota
 
Composer / Posobota
Composer / PosobotaComposer / Posobota
Composer / Posobota
 

Nejlepší cache je žádná cache

  • 1. Nejlepší cache je žádná cache @ProchazkaFilip
  • 4. Nenormalizované relace - duplikace informací - složité udržování konzistence, pokud je takové schéma “source of truth” - updatnout kategorii student znamená updatnout 2 řádky person_id person_name category_id category_name 1 Karel 1 Student 2 Milan 1 Student 3 Franta 2 Učitel
  • 5. Normalizované relace - každá informace je v db jen jednou - snadné editace/mazání a úpravy schématu - 3NF je perfektní na ukládání relačních dat Ale... - u složitých relací s hodně JOINy mají db problém - problém se zhoršuje s narůstajícím množstvím dat - nejde vyřešit výměnou db (MySQL vs PostgreSQL) - ORM lazy loading id name 1 Karel 2 Milan 3 Franta id name 1 Student 2 Učitel person_id category_id 1 1 2 1 3 2
  • 6. Cachováním pomalých dotazů řešíte důsledek, nikoliv příčinu
  • 7. Denormalizace máme normalizované relace a vědomě z nich vytváříme nenormalizované
  • 8. Proč denormalizace? čtení a filtrování nenormalizovaných relací je rychlejší
  • 9. Jak denormalizovat - vytvoření “view” tabulky v současné db - triggery - plnění z modelu, při změně dat - cronjob / rabbitmq worker - materializovaný pohled - o synchronizaci se stará databáze - úplně jiná databáze - například ElasticSearch - plnění z modelu, při změně dat - cronjob / rabbitmq worker
  • 10. Case-study použití ElasticSearch - na Rohlik.cz se kategorie “čerstvé” načítala ~15 vteřin - personalizace => nemožnost použít cache - přenesením logiky filtrování jsme se dostali pod ~4 vteřiny - ES data vyfiltroval a vrátil list IDček - o hydrataci z MySQL se starala Doctrine - zahozením hydratace produktů jsme se dostali na ~1 vteřinu - z ES se získávaly celé dokumenty - ty se obalily do Value Objectů bez mapování properties - stejné rozhranní - bez nutnosti měnit šablony - stále otřesně pomalé, ale už né kvůli výpisu produktů
  • 11. Command Query Responsibility Segregation efektivní read z ElasticSearche v samostatném modelu modifikace dat přes Doctrine nad relační db v samostatném modelu http://martinfowler.com/bliki/CQRS.html