Key-value structure pole v databazi serializovana databaze v jednom poli
- mcmatak
- Člen | 505
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
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
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
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
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
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)