Váš způsob na získávání / udržování / ukládání dat v aplikaci?
- GEpic
- Člen | 566
Ahoj, chci se zeptat jelikož čtu hodně článků a vláken o tom, jak kdo uchovává hodnoty v aplikaci at už třeba pro uživatele, nebo cokoliv jiného a snaží se je udržet vždy aktuální. Bohužel někdy jsou vlákna několik let stará, a já tak nevím, zdali to není přežitek.
Mám tabulku uživatelů:
ID
NAME
ETC...
Tabulku zpráv:
ID
FROM (USER ID) <-- Já nebo jiný uživatel -->
TO (USER ID) <-- Já nebo jiný uživatel -->
MESSAGE
DATE
Tabulku událostí:
ID
OWNER (USER ID)
DATE
TYPE
Jak byste nejlépe a kam uložili tyto hodnoty a drželi je aktuální? V tuto chvíli při každé změně volám databázi a vše vypisuju rovnou do template a už vím, že nyní je čas na pořádnou změnu.
Přemýšlím nad:
Využít Identity?
Využít Sessions?
Naučit se používat Doctrine?
Také mám otázků ohledně následujícího?
Jakým způsobem znovu načíst data při změně? Nebo se dá zařídit, aby
k tomu docházelo „automaticky“?
V tomto jsem absolutní začátečník, a proto se ptám na vaše ověřené způsoby, abych se opět něco přiučil.
Za každou reakci předem díky moc. :)
Editoval GEpic (8. 1. 2016 0:19)
- GEpic
- Člen | 566
Jj samozřejmě jsem myslel ukládat vše v databázi, jen kde data udržovat, cache jsem taky zvažoval a tak či tak se budu muset naučit jí využívat (dle videa o CSFD z POSOBOT)(snad jsem to napsal zprávně :D) mi to přijde nejsympatičtější.
Také mi šlo o to, abych k datům přistupoval vždy jednotným způsobem např $user->info, $user->messages, $user->events kde už by třeba právě v events byli načtené prvky přesně dle uživatelského id… možná na to přijdu zítra, ale evidentně potřebuji spánek…
Edit: Ještě jsem nešel spát, ale také jsem četl článek
o vyhledávání pomocí primárních klíčů (což je většinou můj
případ) a že kolikrát je vyhodnocení dotazu rychlejší, než získávat
data z cache. V aplikaci nevyužívám složité dotazy (díky dobře
navrhnuté databázi) a tak to je většinou
select něco from table where key
, tak nevím už vůbec… :)
Editoval GEpic (8. 1. 2016 0:56)
- Jiří Nápravník
- Člen | 710
Identita na tohle není, nemá smysl tam držet eventy, zprávy a kdoví co vše. Tam bych držeů jen opravdu identitu (rekneme z tabulky users).
Sessions taky neřešit, tam přenášej jen informace o identitě, v podstatě to řeší framework za tebe.
Standardní postup je na tohle mít to vše uložené v databázi a vytáhnout co potřebuješ. Cache je třeba pokud máš hodně navštěvovanou stránku, nebo pokud vidíš, že se něco hodně dlouho vykonává, nemá smysl jí rvát zase všude. Cache samotnou máš nejlepší používat v sablonach aobalovat tím třeba celé komponenty, jde to pak snadno a není se tam (krom invalidace) moc co učit.
- GEpic
- Člen | 566
Jiří Nápravník napsal(a):
Identita na tohle není, nemá smysl tam držet eventy, zprávy a kdoví co vše. Tam bych držeů jen opravdu identitu (rekneme z tabulky users).
Sessions taky neřešit, tam přenášej jen informace o identitě, v podstatě to řeší framework za tebe.
Standardní postup je na tohle mít to vše uložené v databázi a vytáhnout co potřebuješ. Cache je třeba pokud máš hodně navštěvovanou stránku, nebo pokud vidíš, že se něco hodně dlouho vykonává, nemá smysl jí rvát zase všude. Cache samotnou máš nejlepší používat v sablonach aobalovat tím třeba celé komponenty, jde to pak snadno a není se tam (krom invalidace) moc co učit.
Oki takže si udělám jednoduchý model na get /set dat pro uživatele a ty si budu dle potřeby volat nehledě na session, cache a kdo ví co ještě. :)
Editoval GEpic (8. 1. 2016 16:04)
- Oli
- Člen | 1215
Správně by jsi měl mít nějakou vrstvu, říkejme jí třeba manager.
Takže máme třeba CommunicationManager
. A chceš vypsat třeba
zprávy od uživatele Karel. Takže položíš dotaz
$messagesByKarel = $communicationManager->findMessagesByUserName('Karel');
Na pozadí budeš mít třeba MessageRepository
a to vrátí
výsledek. Ta metoda v MessageRepository může vypadat třeba takhle
return $this->context->table('messages')->where('from.name', $name);
A pak si řekneš, „hmm.. mohl bych to cachovat“ a nasadíš na to cache:
public function findByName($name)
{
return $cache->load($key, function(& $dependencies) use ($name) {
$dependencies = [
Cache::TAGS => [
"messageByName/" . $name,
"messages"
]
];
return $this->context->table('messages')->select('message, date, to')->where('from.name', $name)->fetchAll();
});
}
Do cache se myslím nemůže ukládat instance ActiveRow
nebo
Selection
, takže si z databáze musíš vytáhnout pole. A bez
zásahu kamkoli jinam do aplikace máš nasazenou cache pro tenhle dotaz. Pokud
přijde další zpráva tak jen invaliduješ tag
messageByName/Karel
(nebo messages
invaliduješ cache
nad všema zprávama, to ti zajistí, že se příště vykoná ta anonymní
funkce a znovu naplní cache…
Napsal jsem to trochu pochopitelne? :-)
- GEpic
- Člen | 566
Oli napsal(a):
Správně by jsi měl mít nějakou vrstvu, říkejme jí třeba manager. Takže máme třeba
CommunicationManager
. A chceš vypsat třeba zprávy od uživatele Karel. Takže položíš dotaz$messagesByKarel = $communicationManager->findMessagesByUserName('Karel');
Na pozadí budeš mít třeba
MessageRepository
a to vrátí výsledek. Ta metoda v MessageRepository může vypadat třeba takhlereturn $this->context->table('messages')->where('from.name', $name);
A pak si řekneš, „hmm.. mohl bych to cachovat“ a nasadíš na to cache:
public function findByName($name) { return $cache->load($key, function(& $dependencies) use ($name) { $dependencies = [ Cache::TAGS => [ "messageByName/" . $name, "messages" ] ]; return $this->context->table('messages')->select('message, date, to')->where('from.name', $name)->fetchAll(); }); }
Do cache se myslím nemůže ukládat instance
ActiveRow
neboSelection
, takže si z databáze musíš vytáhnout pole. A bez zásahu kamkoli jinam do aplikace máš nasazenou cache pro tenhle dotaz. Pokud přijde další zpráva tak jen invaliduješ tagmessageByName/Karel
(nebomessages
invaliduješ cache nad všema zprávama, to ti zajistí, že se příště vykoná ta anonymní funkce a znovu naplní cache…Napsal jsem to trochu pochopitelne? :-)
Naprosto, přemýšlel jsem jestli vše řešit přes "něco jako user->getVšePotřebné… ale volat nějakého manager a z něho si tahat věci pro dané ID / jméno / cokoliv mi přijde jako nejlepší řešení. :)