Větší objemy dat je potřeba ukládat zvlášť.
Memory storage
- při restartu je paměť zahozena, tedy je to ideální pro cache, krátkodobou Session apod.
- velikost paměti není velká
- př. cache, SQlite (in-memory)
Souborový systém
- data uložena v jednom a více souborech
- problém s konkurečním přístupem (zamykání souborů)
- cacheuje se, protože zápis a čtení z disku je náročná operace
- Session, dlouhodobá cache, SQlite atd.
Databáze
- relační vs. nerelační (př. NoSQL)
- implementuje efektivní ukládání dat
- lépe řeší zámky a přístup k datům
- př. relačních: MySQL, MSSQL, Oracle, PostgreSQL…
- př. nerelačních: Redis, Neo4J, CouchDB, MongoDB…
Existuje více způsobů, jak nakládat s daty z databáze.
Table data gateway
- jedna instance pro všechno
- jedna instance řídí všechny řádky v tabulce (tedy všechny instance dané entity), zapouzdřuje všechny SQL dotazy
Row data gateway
- jedna instance řídí jeden řádek v tabulce (tedy jednu instanci třídy)
- modifikace - lze nemít instanci pro komunikaci s DB vedle, ale všechno mít implementované v rámci třídy jako statické metody (ale je to nedoporučené - statické metody se špatně testují)
- metody pro načítání, ukládání a mazání v databázi jsou v konkrétní instanci
- existuje speciální třída “jen” pro vyhledávání instancí
Active record
- obdoba Row data gateway, akorát přidává business logiku a tím porušuje zásady třívrstvé architektury
- objekt reprezentuje řádek v tabulce
- součástí objektu jsou mimo jiné i metody pro práci s databází
- tedy se objekt umí sám uložit, načíst konkrétní instanci atd.
- logika ukládání a business část je společná
Data mapper
- komplexní mapování objektového světa do relačního
- instance není vázána na konkrétní tabulku
- mapování je uloženo buď v konfiguračních souborech či ve formě anotací
- mám zvlášť entitu držící data a zvlášť entitu, která ji mapuje do DB
- odděluje logiku a data
- samotný mapper obsahuje logiku pro ukládání dat a tím pádem objekt obsahuje jen svá data a business logiku
Work of Unit
- nějaký manager si drží změny, které chci v databázi udělat a pak je provede jako frontu za sebou (
$manager->flush()
) - za mě je to dobré, že si můžu vybrat, kdy se budou provádět změny do databáze a můžu tím urychlit chod aplikace, že to rozdělím do větších bloků, které se budou provádět najednou