Key-value structure pole v databazi serializovana databaze v jednom poli

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

Pouzivate někdo něco takového? Ja to mám hlavně kvuli různým nastavením kde je výsledkem serializovane pole nebo json.

Je to pole které když se deserializuje tak vyplní určitou předem danou strukturu definovaného pole s jeho datovými typy, defaultnimi hodnotami atd.

Proste představte si ze potřebujete uchovávat nastavení k různým modulu a komponentam které ma třeba 50 hodnot a 5 zanoreni. Ukládat kazdou hodnotu ve sloupci nemožné. Jako Radek by bylo moc dotazu do dtb.

Ot@s
Backer | 476
+
0
-

Určitě ano. Pokud hodnoty pole nejsou předmětem SQL dotazů, tak je to docela legitimní praktika. Nevím, co na to říká teorie, ale benefity jednoznačně převažují. Mám takový pocit, že Postgres (poslední veze) má dokonce vestavěnou podporu na XML(JSON?) přímo v hodnotě sloupce (datový typ xml).

Filip Procházka
Moderator | 4668
+
0
-

Obecně jsem pro, proč taky ne, že. Ale na druhou stranu, raději bych to viděl v „pořádném“ datovém modelu, hezky oddělené řádek po řádku v nějaké tabulce component_options a cachoval bych to ;)

mcmatak
Člen | 505
+
0
-

mně ty řádky právě moc nesedí, hlavně to neřeší základní problém, to že nějaká hodnota vůbec nebyla uložena, vznikla nově, a tak jako tak to musíš porovnat s nějakou standardní výchozí a požadovanou strukturou

já sem něco takového napsal, mně hlavně vyhovuje že k tomu můžu přistupovat takto

$config[„informationPanels/left“] apod. jak pro zápis tak pro čtení

no ale hlavní problém je v tom, že mi to moje řešení, které používám už tak 3 roky a asi 3× jsem předělal přijde stále takové nedomrlé, a zajímalo by mne jestli neexistuje nějaké standardní??

Patrik Votoček
Člen | 2221
+
0
-

já to vyřešil tak že mám v DB tabulku o 3 sloupcích (id, key, value). Kde od value ukládám serializovaná data.

Nad tímto mám abstraktní vrstvu která na základě klíče vytáhne a deserializuje data (pokud nejsou nalezena použije se výchozí hodnota).

$max = $context->config->getSetting('maxImageSize', array('width' => 800, 'height' => 600));

Ta abstraktní vrstva se stará i o ukládání. Takže si před uložením zjistí zda má aktualizovat záznam nebo vytvořit nový.

$context->config->setSetting('maxImageSize', array('width' => 800, 'height' => 600));

Co se týče nějakého toho čištění od nepoužívaných dat tak to vůbec neřeším (těch dat tam není tolik abych to řešit musel).

A za tu dobou co to používám (cca 1rok) nastal jediný problém a to při přejmenování třídy (problém s deserializací).

bojovyletoun
Člen | 668
+
0
-

můžeš použít metatable

nebo by posloužilo i samotné filestorage

	/** @menu @echo */
	public function actionStorage($key, $value=null)
	{
		$fs = new Nette\Caching\Storages\FileStorage(__DIR__ . '/../data', NULL);
		$storageKey = 'permanentni předvolby';
		$data = $fs->read($storageKey);
		if (!$data) {
			$data = array();
		}
		if ($key) {
			$data['last-mod'] = date('j.n.Y H:i:s');
			$data[$key] = $value;
			$fs->write($storageKey, $data, array());
		}
		dump($data);
	}

Editoval bojovyletoun (17. 1. 2012 20:34)