Článek v rubrikách:

»PHP
»MySQL
»Dibi

ORM, Row Data Gateway, Table Data Gateway, Active Record, Data Mapper

Co to vlastně ORM je a jaké jsou návrhové vzory objektově relačního mapování. Jak efektivně pracovat s databází?


ORM je objektově relační mapování, je to jakýsi most mezi relačními databázemi (RDBMS) a objekty (OOP). Snažíme se o mapování objektů na data v databázi. Úkolem ORM by mělo být automatické skládání SQL dotazu a zabezpeční základních operací CRUD (create, read, update, delete). Chceme pracovat s objekty, aniž bychom se museli starat o to jakým způsobem budou v pozadí ukládány a získávány.

Tím snad obecný výklad končí, v některých detailech už se různé zdroje rozchází. Podle některých by mělo ORM zabezpečit i dědičnost (tu databáze neznají), mapování datových typů (např. bool mysql vůbec nemá - nahrazuje ho za tinyint(1)), validaci některých omezení jako je např. povinná hodnota (v mysql jedině jako NOT NULL, ovšem když se sql dotazu vůbec neúčastní pak je záznam bez problémů vložen), mapování asociací a sdružených objektů a další.

Nejvýznamější v této oblasti je asi autor a softwarový architekt Martin Fowler, zejména jeho kniha Patterns of Enterprise Application Architecture (ke stažení).

V této knize popisuje nejvýznamější návrhové vzory, které se týkají ORM. Dělí je na návrhové vzory architektury a návrhové vzory chování.

Návrhové vzory architektury (Architecture patterns)

Návrhový vzor architektury popisuje vazby mezi relačním databázovým úložištěm a objektovým modelem.

Domain Model (Doménový model) je souhrn tříd naplňující logiku vazeb, specifikuje atributy tříd, primární klíče, cizí klíče a další potřebné vlastnosti, které přesně odpovídají tabulkám v databázi. Jeden objekt odpovídá jedné tabulce v databázi.

Jednotlivé objekty, bychom pak měli vhodně rozšířit o business logiku, kterou databáze nemohou zajistit. Např. vydat zboží ze skladu lze až po jeho zaskladnění, nebo objednat zboží lze pokud je volná skladová dostupnost.

Table Data Gateway

Je přístup k databázové tabulce, komunikace s databází je obalena do jedné třídy, která data získává i čte, mapuje a vrácí kolekci dat. Najdeme v takové třídě metody jako insert, update, delete, ale i vyhledávací funkce find, findByUrl apod.

Insert

  1. $customer=new Customer();
  2. $customer->name="František";
  3. CustomerTable::insert($customer);

Update

  1. $customer=CustomerTable::find(1);
  2. $customer->name="František";
  3. CustomerTable::update($customer);

Row Data Gateway

Jedna se o model samotného řádku v tabulce databáze. Mapuje přesně vlastnosti objektu, které odpovídají struktuře databázové tabulky, tedy jednotlivým sloupcům. Sám umí provést běžné operace jako insert, update, delete. Pro samotné získání tohoto objektu se využívá externí třídy Finderu.

Insert

  1. $customer=new Customer();
  2. $customer->name="František";
  3. $customer->insert();

Update

  1. $customer=CustomerFinder::find(1);
  2. $customer->name="František";
  3. $customer->update();

Active Record

Kombinuje Row Data Gateway a funkce pro získání objektu z databáze (již existujícího modelu).

Insert

  1. $customer=new Customer();
  2. $customer->name="František";
  3. $customer->insert();

Update

  1. $customer=Customer::find(1);
  2. $customer->name="František";
  3. $customer->update();

Data Mapper

Tento návrh je vhodné použít pokud nelze zajistit zcela ekvivalentní nastavení objektu vůči databázi, například pro účely dědění, nebo jiných OOP vztahů, které relační databáze neumí zachytit. Data Mapper je prostředník mezi relačním schématem databáze a objektovým schématem, využívá se hlavně pro účely, kdy tyto pohledy nejsou totožné.

Problémy nastávají s určováním a povědomím mapperu o stavu objektu, o stavu v databázi a v aplikační vrstvě, jak předcházet duplicitám apod.

Vhodným příkladem je přihlašování uživatelů. Např. systém, který má vlastnosti redakčního webu a zároveň eshopu. Začnete stavět redakční systém a potřebujete kvůli diskusím logovat uživatele (userid, user, pass), později potřebujete zahrnout PR soutěže apod. a potřebujete znát o soutěžícím jeho adresu a jméno (userid, user, pass, name, adress), později přidáte možnost prodávat nějaké suvenýry a uděláte z toho eshop, potřebujete logovat zákazníka (userid, user, pass, name, adress, ICO, DIC, phone, email). A teď co s tím? V OOP budete mít základní objekt User a podědí ho Reader/Competitor a také Customer, ovšem relační databáze Vám tohle nedovolí a nezbyde nic jiného než udělat tři tabulky ve kterých udržujete všechny údaje duplikátně a nastává problém ze které tabulky budete ověřovat přihlašovací údaje. Přesné mapování tabulek v tomto případě může být problém a k vyřešení by měl pomoci Data Mapper.

Data Mapper je objekt , který požádáme o získání zákazníka a je už na něm jak se postará o namapování tohoto objektu a ze kterých tabulek, s objektem zákazníka už pracujeme jako v OOP a příliš nás nezajímá, jak je uložen v databázi. Ten samý objekt se stará o ukládání, mazání a další operace v databázi.

Insert

  1. $customer=array('name'=>"František");
  2. Mapper::Customers()->insert($customer);

Update

  1. $customer=Mapper::Customers()->findById(1);
  2. $customer->name="František";
  3. Mapper::Customers()->update($customer);

Návrhové vzory chování (Behavioral Patterns)

Tyto návrhové vzory se zabývají způsobem jak efektivně data načítat a ukládat. Jak je jednoznačně identifikovat v paměti, jak zajistit konkurenční přístup (jak ukládat data, které nám někdo uložil pod nosem) a další. Nejvýznamnější návrhové vzory jsou např. Unit of Work, Identity Map, Join fetching, Lazy Load atd.

Článek vznikl jako součást seriálu, kde se snažím vytvořit vlastní relační mapování postavené nad Dibi, zde je pro ujasnění pár pojmů ohledně ORM, které můžete prostudovat, abychom věděli o čem se bavíme.

Zajímavé zdroje (další vzory a názory odborníků na přístup)

Pro tvorbu vlastního ORM se asi budu soustředit na návrhový vzor Active Record, případně jeho nějakou kombinaci s Data Mapperem nebo jiným vzorem.

Repository pattern

Určitě stojí za zmínku, krátké porovnání Active Record a Repository pattern najdete v článku od Aleše Roubíčka.

 

podobné články

15.12.2009DbDibiOrm - DibiConnection - staticky, instančně, přistupovat přímo k dibi factory?(17%)
09.12.2009DbDibiOrm(17%)
07.12.2009ORM, dibi, MySQL defaultní hodnoty (pokračování článku)(17%)
03.12.2009MySQL povinné hodnoty, NULL hodnoty, defaultní hodnoty, prázdné hodnoty a jak by se mělo chovat ORM(17%)
22.07.2009ORM, Zend_Db, Doctrine, DibiTableX a co bych navrhl pro dibi(17%)

komentáře

RSS Komentáře k článku RSS Komentáře   Add to Google
15.12.2009 17:41 | Anonym (v6ak) | Dva detaily
  1. Databáze není databázový systém (rozdíl asi jako fieldy třídy a metody pro práci s nimi).
  2. Proč je tu ten magický přístup (ve smyslu statických metod apod.) a ne instance tabulky?
15.12.2009 19:18 | Administrátor | Re: Dva detaily
  1. ? která věta konkrétně? přijde mi slovo databáze všude v kontextu použitelné a pochopitelné?
  2. opět, která část konkrétně?
<?php
$customer=new Customer();
$customer->name="František";
CustomerTable::insert($customer);
?>

navrhuješ snad

<?php
$customer=new Customer();
$customer->name="František";

$customerTable=new CustomerTable();
$customerTable->insert($customer);
?>

?

jendak mi to přijde o řádek navíc a jednak mi přijde, že instance se vytváří úplně zbytečně, pokud to využiji v jedné metodě tak dobrá, ale to mám složitější kód, tak budu pokaždé vytvářet instanci? má to výhodu?

15.12.2009 21:07 | Anonym (v6ak) | Re: Re: Dva detaily
  1. „relačními databázemi (RDBMS)“
  2. Ano, přesně takto, ale vytvářet stačí jen jednou.

Jinak použití instancí může mít výhodu použití omezené tabulky – například mám tabulku aukcí. Typickým příkladem omezené tabulky je zde fixace sloupce s vlastníkem tabulky, takže výběr bude filtrován a při vkládání to bude automaticky doplněno. Při update taky není potřeba myslet na přidání další podmínky. Dělat to bez instancí by byl teprve hnus. Jinak můj názor je částečně ovlivněn i tím, že prostě nemám rád tento přístup a preferuji nějakou formu Dependency Injection. (Neříkám, že jsem jej nikdy nepoužil.) Pokud mám Singleton nebo obecně třídu se statickýma metodama, neměly by IMHO nijak umožnit měnit logický stav. (Úprava cache nemusí být změna logického stavu.)

15.12.2009 21:32 | Administrátor | Re: Re: Re: Dva detaily

Doufám, že se někdo přidá do diskuse k tvému názoru, protože si nejsem jist části:

„Jinak použití instancí může mít výhodu použití omezené tabulky – například mám tabulku aukcí. Typickým příkladem omezené tabulky je zde fixace sloupce s vlastníkem tabulky, takže výběr bude filtrován a při vkládání to bude automaticky doplněno. Při update taky není potřeba myslet na přidání další podmínky. Dělat to bez instancí by byl teprve hnus.“ prosím příklad, nebo bližší vysvětlení

ad. názor: už pár let používám to co ty vyzdvihuješ a opravdu mi vadilo pokud sem chtěl například vytvořit form s několika selecty a nemohl jsem použít

$form->addSelect(„I­Dexpedition“, ExpeditionTable::fet­chPairs());

$form->addSelect(„ID­guaranty“, GuarantyTable::fet­chPairs());

atd.

příjemnější mi bylo i

$form->addSelect(„ID­guaranty“, Guaranty::table()->fetchPairs());

než

$guarantyTable=new GuarantyTable(); $form->addSelect(„ID­guaranty“, $guarantyTable->fetchPairs());

dále proběhli nějaké další funkce a opět potřebovali vrátit něco od tabulky guaranty a opět sem musel vytvářet novou instanci, takže během jedné funkce jsem třeba 3× musel vytvořit instanci tabulky, jen proto, abych vypsal nějaké páry

ale to jen názor, protože funkce na 30–40řádků se stávali hodně nepřehlednými, nicméně stále je to přístup, který upřednostňuje X orm frameworků, řekněme si tedy proč je to špatné nebo je to jen otázka názoru

16.12.2009 15:49 | Anonym (v6ak) | Instanční přístup

Tak si představ toto: máš Presenter s aukcema jen aktuálního uživatele. Použiješ tam tedy něco jako: $this->auctions = $auctions->getSubtableFo­rOwner($userId);

Pak se nemusíš starat o user id při výběrech, vkládání ani úpravě, kde zapomenutí není na první pohled vidět, ale je to dost důležité.

15.12.2009 21:52 | Administrátor | Re: Re: Re: Dva detaily

Chápu, že Dependency Injection má dobré myšlenky, ale dá se to v tomto příkladě nějak v budoucnu použít? Tedy říkáš, že statické metody ne, že Customer::find(1) není správně, protože chceme umožnit využívat instanční metody a vlastnosti instance, tedy tato metoda může v nějakém případě mít potřebu přistupovat k něčemu co je instanční a zaměnitelné, krom přístupu k databázi, tedy getDbConnection, což by mne prakticky také zajímalo jak je realizovatelné?

<? $c1=new Customer(); $c1->save();

$c2=new Customer();

chceš říct, že tady je správné provést něco jako

$c2->setDbConnecti­on(dibi::getCon­nection(‚db2‘));

$c2->save();

mě totiž děsí, že pod nohama objektu Customer odpálím připojení k databázi se kterým třeba počítá

kdy člověk pracuje v rámci jednoho objektu, jednoho modelu s více databázemi zároveň? napadá mne jedině nějaká forma synchronizace (musí se tedy jednat o naprosto totožné databáze, co když před metodou save ověřujeme jestli má zákazník nějaké produkty objednané a pokud ano zapíšeme i rezervace s jeho registrací? pak tedy voláme objekt Product, který nepočítá s tím, že Customer je už někde jinde, že zákazníka ukládá jinam a produkty by měl ověřovat také v databázi jiného systému? no nevím)

16.12.2009 15:52 | Anonym (v6ak) | Re: Re: Re: Re: Dva detaily

Takto určitě ne, instanci připojení bych předával v konstruktoru.

16.12.2009 15:22 | Anonym (Petr Jirásek) | Pěkné

I když nejsem na tak vysoké úrovni, abych zde byl schopen debatovat nad koncepcí ORM vrstvy, tak i tak bych chtěl pochválit autora, protože jsem si konečně udělal bližší představu, co to vlastně ORM znamená.

15.09.2015 08:20 | Anonym (sdf) | sdf

vbntyhjtyj

09.03.2017 11:13 | Anonym (asd) | asd

aaaaa[url=http://u­uuuu.com]uuuu­u[/url]

17.03.2017 07:05 | Anonym (gypsyhadley) | gypsyhadley

It's very easy to find out any topic on net as compared to textbooks, as I found this article at this website.  http://oscarhalen37.blogspot.com.co/ |
http://oscarhalen37.blogspot.com.cy/ |
http://oscarhalen37.blogspot.com.eg/ |
http://oscarhalen37.blogspot.com.es/ |
http://oscarhalen37.blogspot.com.ng/ |
http://oscarhalen37.blogspot.com.mt/ |
http://oscarhalen37.blogspot.com.uy/ |
http://oscarhalen37.blogspot.com.tr/ |
http://oscarhalen37.blogspot.de/ |
http://oscarhalen37.blogspot.fr/ |
http://oscarhalen37.blogspot.gr/ |
http://oscarhalen37.blogspot.ie/ |
http://oscarhalen37.blogspot.in/ |
http://oscarhalen37.blogspot.it/ |
http://oscarhalen37.blogspot.mx/ |
http://oscarhalen37.blogspot.nl/ |
http://oscarhalen37.blogspot.no/ |
http://oscarhalen37.blogspot.pt/ |
http://oscarhalen37.blogspot.ro/ |
http://oscarhalen37.blogspot.sg/ |
http://oscarhalen37.blogspot.ae/ |
http://oscarhalen37.blogspot.al/ |
http://oscarhalen37.blogspot.am/ |
http://oscarhalen37.blogspot.ba/ |
http://oscarhalen37.blogspot.bg/ |
http://oscarhalen37.blogspot.dk/ |
http://oscarhalen37.blogspot.cz/ |
http://oscarhalen37.blogspot.cl/ |
http://oscarhalen37.blogspot.is/ |
http://oscarhalen37.blogspot.co.il/ |
http://oscarhalen37.blogspot.co.id/ |
http://oscarhalen37.blogspot.hu/ |
http://oscarhalen37.blogspot.hr/ |
http://oscarhalen37.blogspot.fi/ |
http://oscarhalen37.blogspot.mk/ |
http://oscarhalen37.blogspot.md/ |
http://oscarhalen37.blogspot.lu/ |
http://oscarhalen37.blogspot.lt/ |
http://oscarhalen37.blogspot.li/ |
http://oscarhalen37.blogspot.co.ke/ |
http://oscarhalen37.blogspot.sn/ |
http://oscarhalen37.blogspot.sk/ |
http://oscarhalen37.blogspot.si/ |
http://oscarhalen37.blogspot.se/ |
http://oscarhalen37.blogspot.ru/ |
http://oscarhalen37.blogspot.rs/ |
http://oscarhalen37.blogspot.co.nz/ |
http://oscarhalen37.blogspot.co.za/ |
http://linton93pascoe.blogspot.com.au/ |
http://linton93pascoe.blogspot.com.ar/ |
http://linton93pascoe.blogspot.com/ |
http://linton93pascoe.blogspot.co.uk/ |
http://linton93pascoe.blogspot.ch/ |
http://linton93pascoe.blogspot.ca/ |
http://linton93pascoe.blogspot.be/ |
http://linton93pascoe.blogspot.com.by/ |
http://linton93pascoe.blogspot.com.br/ |
http://linton93pascoe.blogspot.com.ee/ |
http://linton93pascoe.blogspot.com.co/ |
http://linton93pascoe.blogspot.com.cy/ |
http://linton93pascoe.blogspot.com.eg/ |
http://linton93pascoe.blogspot.com.es/ |
http://linton93pascoe.blogspot.com.ng/ |
http://linton93pascoe.blogspot.com.mt/ |
http://linton93pascoe.blogspot.com.uy/ |
http://linton93pascoe.blogspot.com.tr/ |
http://linton93pascoe.blogspot.de/ |
http://linton93pascoe.blogspot.fr/ |
http://linton93pascoe.blogspot.gr/ |
http://linton93pascoe.blogspot.ie/ |
http://linton93pascoe.blogspot.in/ |
http://linton93pascoe.blogspot.it/ |
http://linton93pascoe.blogspot.mx/ |
http://linton93pascoe.blogspot.nl/ |
http://linton93pascoe.blogspot.no/ |
http://linton93pascoe.blogspot.pt/ |
http://linton93pascoe.blogspot.ro/ |
http://linton93pascoe.blogspot.sg/ |
http://linton93pascoe.blogspot.ae/ |
http://linton93pascoe.blogspot.al/ |
http://linton93pascoe.blogspot.am/ |
http://linton93pascoe.blogspot.ba/ |
http://linton93pascoe.blogspot.bg/ |
http://linton93pascoe.blogspot.dk/ |
http://linton93pascoe.blogspot.cz/ |
http://linton93pascoe.blogspot.cl/ |
http://linton93pascoe.blogspot.is/ |
http://linton93pascoe.blogspot.co.il/ |
http://linton93pascoe.blogspot.co.id/ |
http://linton93pascoe.blogspot.hu/ |
http://linton93pascoe.blogspot.hr/ |
http://linton93pascoe.blogspot.fi/ |
http://linton93pascoe.blogspot.mk/ |
http://linton93pascoe.blogspot.md/ |
http://linton93pascoe.blogspot.lu/ |
http://linton93pascoe.blogspot.lt/ |
http://linton93pascoe.blogspot.li/ |
http://linton93pascoe.blogspot.co.ke/ |
http://linton93pascoe.blogspot.sn/ |
http://linton93pascoe.blogspot.sk/ |
http://linton93pascoe.blogspot.si/ |
http://linton93pascoe.blogspot.se/ |
http://linton93pascoe.blogspot.ru/ |
http://linton93pascoe.blogspot.rs/ |
http://linton93pascoe.blogspot.co.nz/ |
http://linton93pascoe.blogspot.co.za/ |
http://laurawesson74.blogspot.com.au/ |
http://laurawesson74.blogspot.com.ar/ |
http://laurawesson74.blogspot.com/ |
http://laurawesson74.blogspot.co.uk/ |
http://laurawesson74.blogspot.ch/ |
http://laurawesson74.blogspot.ca/ |
http://laurawesson74.blogspot.be/ |
http://laurawesson74.blogspot.com.by/ |
http://laurawesson74.blogspot.com.br/ |
http://laurawesson74.blogspot.com.ee/ |
http://laurawesson74.blogspot.com.co/ |
http://laurawesson74.blogspot.com.cy/ |
http://laurawesson74.blogspot.com.eg/ |
http://laurawesson74.blogspot.com.es/ |
http://laurawesson74.blogspot.com.ng/ |
http://laurawesson74.blogspot.com.mt/ |
http://laurawesson74.blogspot.com.uy/ |
http://laurawesson74.blogspot.com.tr/ |
http://laurawesson74.blogspot.de/ |
http://laurawesson74.blogspot.fr/ |
http://laurawesson74.blogspot.gr/ |
http://laurawesson74.blogspot.ie/ |
http://laurawesson74.blogspot.in/ |
http://laurawesson74.blogspot.it/ |
http://laurawesson74.blogspot.mx/ |
http://laurawesson74.blogspot.nl/ |
http://laurawesson74.blogspot.no/ |
http://laurawesson74.blogspot.pt/ |
http://laurawesson74.blogspot.ro/ |
http://laurawesson74.blogspot.sg/ |
http://laurawesson74.blogspot.ae/ |
http://laurawesson74.blogspot.al/ |
http://laurawesson74.blogspot.am/ |
http://laurawesson74.blogspot.ba/ |
http://laurawesson74.blogspot.bg/ |
http://laurawesson74.blogspot.dk/ |
http://laurawesson74.blogspot.cz/ |
http://laurawesson74.blogspot.cl/ |
http://laurawesson74.blogspot.is/ |
http://laurawesson74.blogspot.co.il/ |
http://laurawesson74.blogspot.co.id/ |
http://laurawesson74.blogspot.hu/ |
http://laurawesson74.blogspot.hr/ |
http://laurawesson74.blogspot.fi/ |
http://laurawesson74.blogspot.mk/ |
http://laurawesson74.blogspot.md/ |
http://laurawesson74.blogspot.lu/ |
http://laurawesson74.blogspot.lt/ |
http://laurawesson74.blogspot.li/ |
http://laurawesson74.blogspot.co.ke/ |
http://laurawesson74.blogspot.sn/ |
http://laurawesson74.blogspot.sk/ |
http://laurawesson74.blogspot.si/ |
http://laurawesson74.blogspot.se/ |
http://laurawesson74.blogspot.ru/ |
http://laurawesson74.blogspot.rs/ |
http://laurawesson74.blogspot.co.nz/ |
http://laurawesson74.blogspot.co.za/ |
http://farrindodson18.blogspot.com.au/ |
http://farrindodson18.blogspot.com.ar/ |
http://farrindodson18.blogspot.com/ |
http://farrindodson18.blogspot.co.uk/ |
http://farrindodson18.blogspot.ch/ |
http://farrindodson18.blogspot.ca/ |
http://farrindodson18.blogspot.be/ |
http://farrindodson18.blogspot.com.by/ |
http://farrindodson18.blogspot.com.br/ |
http://farrindodson18.blogspot.com.ee/ |
http://farrindodson18.blogspot.com.co/ |
http://farrindodson18.blogspot.com.cy/ |
http://farrindodson18.blogspot.com.eg/ |
http://farrindodson18.blogspot.com.es/ |
http://farrindodson18.blogspot.com.ng/ |
http://farrindodson18.blogspot.com.mt/ |
http://farrindodson18.blogspot.com.uy/ |
http://farrindodson18.blogspot.com.tr/ |
http://farrindodson18.blogspot.de/ |
http://farrindodson18.blogspot.fr/ |
http://farrindodson18.blogspot.gr/ |
http://farrindodson18.blogspot.ie/ |
http://farrindodson18.blogspot.in/ |
http://farrindodson18.blogspot.it/ |
http://farrindodson18.blogspot.mx/ |
http://farrindodson18.blogspot.nl/ |
http://farrindodson18.blogspot.no/ |
http://farrindodson18.blogspot.pt/ |
http://farrindodson18.blogspot.ro/ |
http://farrindodson18.blogspot.sg/ |
http://farrindodson18.blogspot.ae/ |
http://farrindodson18.blogspot.al/ |
http://farrindodson18.blogspot.am/ |
http://farrindodson18.blogspot.ba/ |
http://farrindodson18.blogspot.bg/ |
http://farrindodson18.blogspot.dk/ |
http://farrindodson18.blogspot.cz/ |
http://farrindodson18.blogspot.cl/ |
http://farrindodson18.blogspot.is/ |
http://farrindodson18.blogspot.co.il/ |
http://farrindodson18.blogspot.co.id/ |
http://farrindodson18.blogspot.hu/ |
http://farrindodson18.blogspot.hr/ |
http://farrindodson18.blogspot.fi/ |
http://farrindodson18.blogspot.mk/ |
http://farrindodson18.blogspot.md/ |
http://farrindodson18.blogspot.lu/ |
http://farrindodson18.blogspot.lt/ |
http://farrindodson18.blogspot.li/ |
http://farrindodson18.blogspot.co.ke/ |
http://farrindodson18.blogspot.sn/ |
http://farrindodson18.blogspot.sk/ |
http://farrindodson18.blogspot.si/ |
http://farrindodson18.blogspot.se/ |
http://farrindodson18.blogspot.ru/ |
http://farrindodson18.blogspot.rs/ |
http://farrindodson18.blogspot.co.nz/ |
http://farrindodson18.blogspot.co.za/ |
http://andreabarlow75.blogspot.com.au/ |
http://andreabarlow75.blogspot.com.ar/ |
http://andreabarlow75.blogspot.com/ |
http://andreabarlow75.blogspot.co.uk/ |
http://andreabarlow75.blogspot.ch/ |
http://andreabarlow75.blogspot.ca/ |
http://andreabarlow75.blogspot.be/ |
http://andreabarlow75.blogspot.com.by/ |
http://andreabarlow75.blogspot.com.br/ |
http://andreabarlow75.blogspot.com.ee/ |
http://andreabarlow75.blogspot.com.co/ |
http://andreabarlow75.blogspot.com.cy/ |
http://andreabarlow75.blogspot.com.eg/ |
http://andreabarlow75.blogspot.com.es/ |
http://andreabarlow75.blogspot.com.ng/ |
http://andreabarlow75.blogspot.com.mt/ |
http://andreabarlow75.blogspot.com.uy/ |
http://andreabarlow75.blogspot.com.tr/ |
http://andreabarlow75.blogspot.de/ |
http://andreabarlow75.blogspot.fr/ |
http://andreabarlow75.blogspot.gr/ |
http://andreabarlow75.blogspot.ie/ |
http://andreabarlow75.blogspot.in/ |
http://andreabarlow75.blogspot.it/ |
http://andreabarlow75.blogspot.mx/ |
http://andreabarlow75.blogspot.nl/ |
http://andreabarlow75.blogspot.no/ |
http://andreabarlow75.blogspot.pt/ |
http://andreabarlow75.blogspot.ro/ |
http://andreabarlow75.blogspot.sg/ |
http://andreabarlow75.blogspot.ae/ |
http://andreabarlow75.blogspot.al/ |
http://andreabarlow75.blogspot.am/ |
http://andreabarlow75.blogspot.ba/ |
http://andreabarlow75.blogspot.bg/ |
http://andreabarlow75.blogspot.dk/ |
http://andreabarlow75.blogspot.cz/ |
http://andreabarlow75.blogspot.cl/ |
http://andreabarlow75.blogspot.is/ |
http://andreabarlow75.blogspot.co.il/ |
http://andreabarlow75.blogspot.co.id/ |
http://andreabarlow75.blogspot.hu/ |
http://andreabarlow75.blogspot.hr/ |
http://andreabarlow75.blogspot.fi/ |
http://andreabarlow75.blogspot.mk/ |
http://andreabarlow75.blogspot.md/ |
http://andreabarlow75.blogspot.lu/ |
http://andreabarlow75.blogspot.lt/ |
http://andreabarlow75.blogspot.li/ |
http://andreabarlow75.blogspot.co.ke/ |
http://andreabarlow75.blogspot.sn/ |
http://andreabarlow75.blogspot.sk/ |
http://andreabarlow75.blogspot.si/ |
http://andreabarlow75.blogspot.se/ |
http://andreabarlow75.blogspot.ru/ |
http://andreabarlow75.blogspot.rs/ |
http://andreabarlow75.blogspot.co.nz/ |
http://andreabarlow75.blogspot.co.za/ |
http://daynawatson37.blogspot.com.au/ |
http://daynawatson37.blogspot.com.ar/ |
http://daynawatson37.blogspot.com/ |
http://daynawatson37.blogspot.co.uk/ |
http://daynawatson37.blogspot.ch/ |
http://daynawatson37.blogspot.ca/ |
http://daynawatson37.blogspot.be/ |
http://daynawatson37.blogspot.com.by/ |
http://daynawatson37.blogspot.com.br/ |
http://daynawatson37.blogspot.com.ee/ |
http://daynawatson37.blogspot.com.co/ |
http://daynawatson37.blogspot.com.cy/ |
http://daynawatson37.blogspot.com.eg/ |
http://daynawatson37.blogspot.com.es/ |
http://daynawatson37.blogspot.com.ng/ |
http://daynawatson37.blogspot.com.mt/ |
http://daynawatson37.blogspot.com.uy/ |
http://daynawatson37.blogspot.com.tr/ |
http://daynawatson37.blogspot.de/ |
http://daynawatson37.blogspot.fr/

19.03.2017 05:59 | Anonym (cheap jordans) | cheap jordans

Cheap MLB Snapback hats Cheap Snapback hats Cheap Snapbacks Cheap NHL Sport Snapbacks Cheap NCAA College Hats Cheap NBA hats Cheap NFL hats cheap nba caps tisa snapback

Cheap MLB Snapback Cheap Snapback hats Cheap Snapbacks Cheap NHL Sport Snapbacks Cheap NCAA College Hats Cheap NBA Snapback Cheap NFL Snapback cheap nba caps tisa snapback

Cheap MLB Snapback Cheap Snapback hats Cheap Snapbacks Cheap NHL Sport Snapbacks Cheap NCAA College Hats Cheap NBA hats Cheap NFL hats cheap nba caps tisa snapback

Cheap MLB Snapback Cheap Snapback hats Cheap Snapbacks Cheap NHL Sport Snapbacks Cheap NCAA College Snapback Cheap NBA Snapback Cheap NFL Snapback cheap nba caps tisa snapbackCheap MLB hats Cheap Snapback hats Cheap Snapbacks Cheap NHL Sport hats Cheap NCAA College hats Cheap NBA hats Cheap NFL Snapback hats cheap nba caps tisa snapbackCheap MLB Snapbacks Cheap Snapback hats Cheap Snapbacks Cheap NHL Sport Snapbacks Cheap NCAA College Snapbacks Cheap NBA Snapbacks Cheap NFL Snapback cheap nba caps tisa snapbackCheap MLB hats Cheap Snapback hats Cheap Snapbacks Cheap NHL Sport hats Cheap NCAA College hats Cheap NBA hats Cheap NFL hats cheap nba caps tisa snapbackCheap MLB Snapbacks Cheap Snapback hats Cheap Snapbacks Cheap NHL Snapbacks Cheap NCAA College Snapbacks Cheap NBA Snapbacks Cheap NFL Snapback cheap nba caps tisa snapbackCheap MLB Snapbacks Cheap Snapback hats Cheap Snapbacks Cheap NHL Snapbacks Cheap NCAA College Snapbacks Cheap NBA Snapbacks Cheap NFL Snapback cheap nba caps tisa snapback 10 cheap jordans Cheap Air Jordans cheap retro jordans cheap jordan shoes cheap jordans free shipping cheap jordans online cheap air jordans for sale Cheap Air Jordan12 Cheap Air Jordan 11 11 cheap jordans Cheap Air Jordans cheap retro jordans cheap jordan shoes cheap jordans free shipping cheap jordans online cheap air jordans for sale Cheap Air Jordan 12 Cheap Jordan 11 12 cheap jordans Cheap Air Jordans cheap retro jordans cheap jordan shoes cheap jordans free shipping cheap jordans online cheap air jordans for sale Cheap Air Jordan 12 Cheap Jordan 11 wholesale jordan shoes 13 cheap jordans Cheap Air Jordans cheap retro jordans cheap jordan shoes cheap jordans free shipping cheap jordans online cheap air jordans for sale Cheap Air Jordan 12 Cheap Jordan 11 wholesale jordan shoes 14 cheap jordans cheap jordans for sale Cheap Air Jordans cheap retro jordans cheap jordan shoes cheap jordans free shipping cheap jordans online cheap air jordans for sale Cheap Air Jordan 12 Cheap Jordan 11 wholesale jordan shoes 15 cheap jordans cheap jordans for sale Cheap Air Jordans cheap retro jordans cheap jordan shoes cheap jordans free shipping cheap jordans online cheap air jordans for sale Cheap Air Jordan 12 Cheap Jordan 11 wholesale jordan shoes 16 Cheap MLB Snapbacks Cheap Snapback hats Cheap Snapbacks Cheap NHL Snapbacks Cheap NCAA College Snapbacks Cheap NBA Snapbacks Cheap NFL Snapback cheap nba caps tisa snapback 17 cheap jordans cheap jordans for sale Cheap Air Jordans cheap retro jordans cheap jordan shoes cheap jordans free shipping cheap jordans online cheap air jordans for sale Cheap Air Jordan 12 Cheap Jordan 11 wholesale jordan shoes 18 cheap jordans cheap jordans for sale Cheap Air Jordans cheap retro jordans cheap jordan shoes cheap jordans free shipping cheap jordans online cheap air jordans for sale Cheap Air Jordan 12 Cheap Jordan 11 wholesale jordan shoes 19 cheap jordans cheap jordans for sale Cheap Air Jordans cheap retro jordans cheap jordan shoes cheap jordans free shipping cheap jordans online cheap air jordans for sale Cheap Air Jordan 12 Cheap Jordan 11 wholesale jordan shoes 20 cheap jordans cheap jordans for sale Cheap Air Jordans cheap retro jordans cheap jordan shoes cheap jordans free shipping cheap jordans online cheap air jordans for sale Cheap Air Jordan 12 Cheap Jordan 11 wholesale jordan shoes 21 cheap jordans cheap jordans for sale Cheap Air Jordans cheap retro jordans cheap jordan shoes cheap jordans free shipping cheap jordans online cheap air jordans for sale Cheap Air Jordan 12 Cheap Jordan 11 wholesale jordan shoes 22 cheap jordans cheap jordans for sale Cheap Air Jordans cheap retro jordans cheap jordan shoes cheap jordans free shipping cheap jordans online cheap air jordans for sale Cheap Air Jordan 12 Cheap Jordan 11 wholesale jordan shoes 23 cheap jordans cheap jordans for sale Cheap Air Jordans cheap retro jordans cheap jordan shoes cheap jordans free shipping cheap jordans online cheap air jordans for sale Cheap Air Jordan 12 Cheap Jordan 11 wholesale jordan shoes 24 cheap jordans cheap jordans for sale Cheap Air Jordans cheap retro jordans cheap jordan shoes cheap jordans free shipping cheap jordans online cheap air jordans for sale Cheap Air Jordan 12 Cheap Jordan 11 wholesale jordan shoes 25 cheap jordans cheap jordans for sale Cheap Air Jordans cheap retro jordans cheap jordan shoes cheap jordans free shipping cheap jordans online cheap air jordans for sale Cheap Air Jordan 12 Cheap Jordan 11 wholesale jordan shoes

cheap jordans cheap jordans for sale Cheap Air Jordans cheap retro jordans cheap jordan shoes cheap jordans free shipping cheap jordans online cheap air jordans for sale Cheap Air Jordan 12 Cheap Jordan 11 wholesale jordan shoes 27 cheap jordans cheap jordans for sale Cheap Air Jordans cheap retro jordans cheap jordan shoes cheap jordans free shipping cheap jordans online cheap air jordans for sale Cheap Air Jordan 12 Cheap Jordan 11 wholesale jordan shoes

adidas ultra boost adidas ultra boost uncaged adidas ultra boost white adidas ultra boost black adidas yeezy adidas uk adidas yeezy boost adidas yeezy boost 350 yeezy boost 350 yeezy ultra boost Adidas Yeezy 350 Boost Yeezy 350 Yeezy Boost 350 V2 Yeezy Boost 350 Cheap Yeezys yeezy boost 350 cheap adidas yeezys cheap yeezys uk cheap yeezy boost Adidas Yeezy UK Cheap Yeezys yeezy boost 350 cheap adidas yeezys cheap yeezys V2 cheap yeezy boost Adidas Yeezys Cheap Yeezy 350 Boost adidas yeezy 350 boost yeezy boost 350 Yeezy 350 Boost v2 cheap yeezys yeezy 350 boost Yeezy 350 Boost for sale Yeezy Boost 350 For Sale Yeezy Boost 350 For Sale Yeezy For Sale Yeezy 350 Boost v2 Yeezy Sale yeezy boost 350 yeezy boost 750 adidas yeezy boost yeezy boost cheap yeezy boost Adidas Yeezy UK yeezy boost 350 yeezy boost 750 adidas yeezy boost yeezy boost cheap yeezy boost Adidas Yeezy UK Yeezy Shoes Yeezy shoes 350 Yeezy Boost 350 Adidas Yeezy cheap yeezys Adidas Yeezy Shoes Yeezy Shoes sale Yeezy Shoes Yeezy shoes 350 Yeezy Boost 350 Adidas Yeezy cheap yeezys Adidas Yeezy Shoes Yeezy Shoes sale Yeezy Shoes Yeezy shoes 350 Yeezy Boost 350 Adidas Yeezy cheap yeezys Adidas Yeezy Shoes Yeezy Shoes sale Yeezy Shoes Yeezy shoes 350 Yeezy Boost 350 Adidas Yeezy cheap yeezys Adidas Yeezy Shoes Yeezy Shoes sale Yeezy Shoes Yeezy shoes 350 Yeezy Boost 350 Adidas Yeezy cheap yeezys Adidas Yeezy Shoes Yeezy Shoes sale Yeezy Boost V2 Yeezy 350 V2 Yeezy V2 For Sale adidas ultra boost adidas ultra boost uncaged adidas ultra boost white adidas ultra boost black Cheap Adidas Yeezy Cheap Adidas NMD Shoes Discount Adidas Yeezy Discount Adidas NMD Shoes Adidas Yeezy Shoes Adidas NMD Shoes Cheap Adidas NMD Cheap Adidas Yeezy Boost Cheap Adidas Stan Smith Discount Adidas Yeezy Boost Discount Adidas NMD Adidas Yeezy US Adidas Yeezy 350 Boost Yeezy 350 Yeezy Boost 350 V2 Yeezy Boost 350 Cheap Yeezy 350 Boost adidas yeezy 350 boost yeezy boost 350 Yeezy 350 Boost v2 cheap yeezys yeezy 350 boost Yeezy 350 Boost for sale Cheap Yeezys yeezy boost 350 cheap adidas yeezys cheap yeezy boost Adidas Yeezy Cheap Yeezy 350 Boost adidas yeezy 350 boost yeezy boost 350 Yeezy 350 Boost v2 cheap yeezys yeezy 350 boost Yeezy 350 Boost for sale Yeezy Boost Adidas Yeezy Boost Yeezy Boost 350 Adidas Yeezy cheap yeezys Yeezy Boost 750 Yeezy Boost Sale Cheap Yeezy 350 Boost adidas yeezy 350 boost yeezy boost 350 Yeezy 350 Boost v2 cheap yeezys yeezy 350 boost Yeezy 350 Boost for sale Cheap Yeezy 350 Boost adidas yeezy 350 boost yeezy boost 350 Yeezy 350 Boost v2 cheap yeezys yeezy 350 boost Yeezy 350 Boost for sale Yeezy Boost 350 For Sale Yeezy Boost For Sale Yeezy For Sale Yeezy 350 Boost v2 Yeezy Sale yeezy boost 350 yeezy boost 750 adidas yeezy boost yeezy boost cheap yeezy boost Adidas Yeezy UK Yeezy Shoes Yeezy shoes 350 Yeezy Boost 350 Adidas Yeezy cheap yeezys Adidas Yeezy Shoes Yeezy Shoes sale Yeezy Shoes Yeezy shoes 350 Yeezy Boost 350 Adidas Yeezy cheap yeezys Adidas Yeezy Shoes Yeezy Shoes sale Yeezy Boost 350 V2 Yeezy V2 Yeezy V2 Boost

24.03.2017 08:54 | Anonym (wq) | wq

memphis grizzlies jersey, nike store, swarovski jewelry, cheap michael kors, nike tn, chicago bulls jersey, chrome hearts, converse sneakers, redskins jerseys, montre homme, titans jerseys, pandora charms, armani outlet, wedding dresses, swarovski australia, abercrombie, coach factory outlet, air max, air huarache, ray ban sunglasses, air jordan, tory burch shoes, ralph lauren factory store, longchamp taschen, cheap true religion, swarovski jewelry, stephen curry shoes, north face backpacks, tory burch outlet, long champ, nike air force, rolex watches, celine outlet, true religion jeans outlet, burberry handbags, nike outlet, texans jerseys, golden state warriors jersey, barbour factory, long champ, north face, boston celtics jersey, vans shoes, new balance outlet, burberry online shop, hollister clothing store, burberry, p90×, steelers jerseys, barbour outlet, brooklyn nets jerseys, barbour jackets, seahawks jerseys, patriots jerseys, handbags outlet, oakley vault, celine bags, soccer shoes, michael kors outlet, calvin klein underwear, marc by marc jacobs, purses and handbags, jaguars jerseys, coach outlet online, philadelphia 76ers jerseys, northface, barbour outlet, asics, lunette ray ban, converse shoes, longchamp outlet, valentino outlet, baseball jerseys, the north face, watches canada, michael kors, adidas.se, san antonio spurs jerseys, baseball jerseys, rams jerseys, oakley outlet, denver nuggets jerseys, polo ralph, ray ban sonnenbrillen, ralph lauren, michael kors bags, michael kors taschen, hogan, vans schuhe, phoenix suns jersey, vans outlet, nike air max, giants jerseys, michael kors purses, beats by dre, jets jerseys, portland trail blazers jersey, polo ralph lauren outlet, jordan release dates 2015, cheap basketball shoes, christian louboutin, sacramento kings jersey, chi flat iron, houston rockets jerseys, nike air max, ralph lauren outlet, burberry sale, colts jerseys, cleveland cavaliers, ralph lauren, giuseppe shoes, soccer shoes outlet, coach factory, givenchy outlet, bears jerseys, north face jackets, burberry outlet online, new balance, marc by marc jacobs, nike air max thea, michael kors outlet online sale, oklahoma city thunder jersey, roshe run, bills jerseys, ralph lauren outlet online, glasses frames, abercrombie, air max schoenen, red bottom shoes, rolex, dsquared2, toms.com, true religion jeans women, thomas sabo, bcbg max azria, levis jeans, michael kors bags, air max, ralph lauren, rayban, juicy couture outlet, ralph lauren outlet, burberry outlet, nike shoes, longchamp outlet, nike roshe, air jordan shoes, toronto raptors jersey, packers jerseys, swarovski crystal, zapatillas nike, adidas superstar, prada sunglasses, cheap ray ban, roshe run, timberland boots, cheap oakley sunglasses, heat jerseys, ray ban outlet, new york knicks, giuseppe zanotti sneakers, dsquared2 sale, air max, abercrombie kids, toms outlet online, coach black friday, tommy hilfiger, toms shoes, michael kors outlet online sale, bengals jerseys, knockoff handbags, rolex watches for sale

07.04.2017 03:46 | Anonym (w^~)ހ) | cnono
21.04.2017 13:17 | Anonym (qqqqqing20170422) | qqqqqing

qqqqqing20170422fe­rragamo shoes michael kors outlet online adidas outlet store coach outlet online rolex watches outlet coach outlet canada pandora outlet coach outlet online true religion jeans michael kors outlet ralph lauren uk fitflops oakley sunglasses sale adidas nmd runner cheap ray ban sunglasses ray ban sunglasses outlet hollister clothing lebron shoes nike air max 90 cheap oakley sunglasses polo ralph lauren nike roshe one michael kors handbags air max 90 oakley sunglasses wholesale nfl jerseys wholesale michael kors outlet coach outlet online ralph lauren outlet nike outlet store tory burch outlet louis vuitton outlet michael kors factory outlet hollister clothing michael kors handbags michael kors outlet store polo ralph lauren coach outlet montblanc pens louis vuitton borse mulberry outlet nike roshe run louis vuitton outlet louis vuitton outlet michael kors outlet nike trainers uk coach outlet online coach factory outlet longchamp handbags coach outlet online coach factory outlet louis vuitton outlet pandora charms herve leger outlet oakley sunglasses sale michael kors factory outlet christian louboutin shoes nike shoes for women ralph lauren polo cartier watches cheap jordan shoes nike air force 1 air max 90 cheap jordans free shipping ray ban sunglasses wholesale kate spade handbags longchamp louis vuitton nike trainers reebok trainers air max uk mac cosmetics ralph lauren outlet rolex uk salomon shoes ray ban sunglasses ferragamo shoes gucci outlet true religion jeans oakley sunglasses oakley sunglasses cheap replica watches oakley sunglasses wholesale michael kors uk polo ralph lauren michael kors outlet online michael kors handbags clearance ray ban sunglasses ralph lauren outlet louis vuitton outlet louis vuitton outlet oakley sunglasses nike shoes ralph lauren juicy couture outlet louis vuitton uk christian louboutin hermes bags coach factory outlet michael kors outlet clearance coach factory outlet asics,asics israel,asics shoes,asics running shoes,asics israel,asics gel,asics running,asics gel nimbus,asics gel kayano jordan shoes polo ralph lauren nike trainers christian louboutin shoes michael kors outlet true religion jeans longchamp outlet christian louboutin shoes coach outlet ferragamo outlet polo outlet store converse shoes sale prada handbags tory burch outlet michael kors outlet online louis vuitton handbags puma shoes nba jerseys ray ban sunglasses true religion outlet true religion jeans cheap jordans mizuno running shoes coach handbags outlet polo outlet fred perry polo polo outlet stores louis vuitton cheap oakley sunglasses louis vuitton gucci borse louis vuitton polo pas cher michael kors outlet michael kors ray ban sunglasses polo ralph lauren oakley sunglasses coach outlet online lacoste polo shirts louis vuitton outlet stores mulberry handbags michael kors outlet stores coach outlet hermes birkin polo ralph lauren true religion jeans sale replica watches fitflops outlet nike air max 2015 polo ralph lauren oakley sunglasses wholesale los angeles lakers jerseys polo outlet cheap ray ban sunglasses longchamp handbags new balance shoes rolex watches basketball shoes,basketball sneakers,lebron james shoes,sports shoes,kobe bryant shoes,kobe sneakers,nike basketball shoes,running shoes,mens sport shoes,nike shoes ralph lauren outlet stores lebron james shoes oakley sunglasses polo ralph lauren outlet christian louboutin football shirts michael kors outlet online nhl jerseys louis vuitton outlet stores louis vuitton outlet tory burch outlet online store swarovski outlet burberry outlet cheap football shirts tory burch outlet online mulberry outlet coach outlet online ray ban sunglasses michael kors handbags tory burch outlet online nike store uk dior sunglasses gucci site ufficiale ralph lauren cheap jordans oakley sunglasses wholesale michael kors outlet clearance air max 90 coach factory outlet oakley sunglasses mlb jerseys swarovski jewelry louis vuitton outlet nike foamposite louis vuitton polo ralph lauren louis vuitton michael kors outlet online links of london rolex watches coach outlet store online oakley sunglasses sale rolex watches tory burch outlet ray ban sunglasses ed hardy clothing true religion jeans mlb jerseys rolex watches oakley sunglasses michael kors outlet clearance ray ban sunglasses pandora jewellery yeezy boost 350 marc jacobs outlet tory burch outlet online longchamp handbags ferragamo outlet michael kors outlet coach outlet cheap ray bans coach outlet online salomon outlet louis vuitton oakley sunglasses polo ralph lauren true religion uk replica watches swarovski crystal nfl jerseys adidas nmd longchamp coach outlet clearance cartier watches for sale michael kors handbags louis vuitton handbags cheap jordans coach outlet store online hollister clothing nba jerseys christian louboutin outlet coach outlet store online louis vuitton outlet clearance gucci outlet online coach outlet clearance swarovski jewelry nike huarache fitflops sale clearance louis vuitton outlet store nike mercurial christian louboutin outlet basketball shoes michael kors handbags sale polo outlet cheap ray ban sunglasses coach factory outlet coach outlet online hollister clothing air max 90 longchamp cheap oakley sunglasses air max uk longchamp outlet louis vuitton iphone case uk michael kors outlet cheap mlb jerseys christian louboutin shoes ysl outlet online polo outlet online nike air max michael kors canada coach outlet online juicy couture tracksuit prada outlet ralph lauren polo nike soccer shoes michael kors outlet clearance vans shoes louis vuitton handbags michael kors handbags true religion outlet michael kors handbags outlet coach factory outlet louis vuitton nike trainers pandora outlet giuseppe zanotti outlet rolex watches for sale nike huarache longchamp handbags louis vuitton ysl outlet reebok shoes supra shoes sale mulberry bags fitflops sale clearance hollister sale mulberry handbags mcm backpack ralph lauren uk qqqqqing20170422

Jméno
Název
Text
Lze používat Texy! syntax. Příklad syntaxe: "text odkazu":odkaz, **tučně**, *kurzíva*, `code`. PHP kód uzavírejte do <?php ... ?> a JavaScript do <script> ... </script>