Dibi/Database a substituce
- hrach
- Člen | 1838
Používáte v dibi (databse) substituce? Ano? Zajímá mě jak a k čemu.
Moje představa:
- substituce jsou používány pouze pro názvy tabulek pro vyhnutí se
prefixům → není třeba psát prefixy ala
wp_
- případně samozřejmě se používá více druhé těchto substitucí-prefixů (:blog: → wp_, :site: → wp_web_)
- zjednodušeně: substituce jsou požívány pouze s názvy tabulek
Mám pravdu? Co vy? Prosím jen z praxe, ne, co si myslíte, že byste mohli v příštím projektu použít.
- hAssassin
- Člen | 293
@hrach > tak taky prihodim trochu do mlynku… v byvaly praci jsme prefixy pouzivali, ale hlavne z toho duvodu, ze se predelaval system a bylo potreba rozlisit novy tabulky (s prefixem) od tech starych (bez prefixu). Ale posledni dobou zjistuju ze je to spis zlo a porad na tom zapominam, takze (ikdyz jsi psal ze se o budoucich projektech zminovat nemame) je brzo asi zase pouzivat prestanu…
ale podle me spis zalezi jak je databaze slozita a jestli obsahuje tabulky pro vic projektu (celkem blbost, ale taky sem videl :D) nebo ne apod… Ono kdyz je pres 300 tabulek tak je dobry je mit rozliseny vice prefixy a ne jenom jednom, je v tom vetsi prehled.
- westrem
- Člen | 398
Pouzivam prefixy u kazdeho projektu a to automaticky a intuitivne.
Dovody su nasledovne:
- niekedy narazis na limited hosting u klienta a si nuteny tak mat vsetky tabulky v 1 DB
- pri jednom projekte mozes mat viacero subaplikacii ktore pouzivaju svoje tabulky napr WordPress a tvoja aplikacia
- v jednej samostatnej aplikacii takto namespacujem nazvy tabuliek. Napr:
fb_
su tabulky ktore sluzia pre FB appku,stat_
su tabulky ktore uchovavaju potom statistiky nad danou appkou apod
Okrem spominanych vyhod ma napada aj jedna mala – na prvy pohlad
nebadatelna, no mrte efektivna – Jakubov Adminer dokaze pri exporte DB
spravit regex vyhladavanie podla prefixov a teda namiesto vyklikavanie napr
30 tabuliek na export (phpMyAdmin) si kliknem na prefix stats_
a
vuala – mam oznacene vsetky tabulky so statistikami na export ;)
- 22
- Člen | 1478
+1 westream..
mám tu na stole něco podobného. Zákazník udržuje X projektů v jedné DB.
Rozlšijí tabulky prefixy a důvodem je nějaká souhranná administrace nad
touto DB, která jim podle prefixů tuhle DB dokáže spravovat. Takže jsem
nucen v tom případě používát prefixy, které si zadavatel předem určil.
Normálně má k prefixům averzi :-)
- hrach
- Člen | 1838
no, spíš se bavím o těch celoaplikačních prefixech (app_user, app_user_address) a ptam se, jestli v tu chvli nekdo pouziva fb_user. Z vyse zmineneho sem pochopil, ze ano.
Abych jeste lepe specifikoval problem, jde o toto:
- v klasickem dibi se hodilo psat do sql substituce, ani
jinak to neslo, napsat parser na sql by neslo
(
select * from [:fb:user] where ...
) - v nette database jsou substituce taky, ale aktualne nefunguji na tabulky
(
$db->table(':fb:user')
) - v nette database by šlo takoveto věci dělat automaticky pomocí upravené database struktury, kteoru jsem již naprogramoval a pulloval
- dana automatika je velmi mocná, nicméně by znepříjemnila život v situaci, kdy máme dvě tabulky s různým prefixem. Šlo by pak v rámci automatiky udělat něco takévehoto:
use Nette\Database\Reflection\DatabaseReflection;
class MyDatabaseReflection extends DatabaseReflection
{
public function __construct()
{
parent::__construct('id', '%s_id', '%s', 'myapp_%s');
}
public function getPrimary($table)
{
if (substr($table, 0, 3) === 'fb_')
$table = substr($table, 4);
return parent::getPrimary($table);
}
public function getReferencedColumn($name, $table)
{
if (substr($table, 0, 3) === 'fb_')
$table = substr($table, 4);
return parent::getReferencedColumn($name, $table);
}
public function getReferencedTable($name, $table)
{
if (substr($table, 0, 3) === 'fb_')
$table = substr($table, 4);
return parent::getReferencedTable($name, $table);
}
public function getPrefixedTable($table)
{
if (substr($table, 0, 3) == 'fb_')
return $table;
return parent::getPrefixedTable($table);
}
}
V této ukázce
- V této ukázce bych pro běžný prefix (myapp_) bych používal
Nette\Database naprosto standardně bez starostí
(
$db->table('users')
→.. from myapp_users ..
) - Pro fb aplikační tabulky bych používal jejich název s prefixem
$db->table('fb_users')
→.. from fb_users ..
- dané používání tabulek lze samozřejmě kombinovat
$db->table('users')->where('facebook_user_id', $db->table('fb_users')->where(...))
- westrem
- Člen | 398
Nepouzivam najnovsiu Nette DB vrstvu ale ten kusok kodu co si tu napisal a popisal jeho funkcionalitu mi pride hoodne magicky. Vidim v query pouzitu tabulku ‚users‘ a ono sa to realne taha z ‚myapp_users‘? To nie je prilis intutivne, najme ak s kodom robi aj niekto kto tie utroby nepozna. Naopak ak v query uvidi ‚:p:users‘ tak mu zacne vrtat hlavou co to ‚:p:‘ znamena, pretoze to nie je platny identifier a bud si to najde v dokumentacii alebo sa spyta inych ludi z projektu .. Ale to je len moj nazor ;)
- hrach
- Člen | 1838
Ale kdepak. Magické to není. Jen je si třeba uvědomit, že to co jsem
napsal je nejeextrémnější případ. Pro výše jmenované případy stačí
new DatabaseReflection('id', '%s_id', '%s', 'myapp_%s')
. Pokud vám
přijde magické, že se před tabulky doplňuje automaticky prefix, tak jste
dost velicí alibisti, když přitom používáte nette, přepisujete si usery
na vlastní. V tom fakt není žádná magie :P