Váš způsob na získávání / udržování / ukládání dat v aplikaci?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
GEpic
Člen | 566
+
0
-

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)

CZechBoY
Člen | 3608
+
0
-

Muzes vyuzit Nette cache. Pokud neco zmenis tak smazat podle tagu. Ukladat data muzes treba v db a vytahnes je jen pokud nejsou v cachi (filesystem, redis, memcache, …).

GEpic
Člen | 566
+
0
-

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
+
0
-

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
+
0
-

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
+
+1
-

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
+
0
-

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 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? :-)

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í. :)