Obecně

Link databáze uchovává všechny vazby mezi jednotlivými entitami (tzv. items) a to napříč databázemi (core, master, web) a jazykovými verzemi. Z této databáze lze zjistit seznam entit, na které se konkrétní entita odkazuje, ale i seznam entit, které se na tuto entitu odkazují např. stránka vytvořená z konkrétní šablony obsahuje referenci právě na tuto šablonu. Existence této databáze je důležitá především pro zvýšení rychlosti při zjišťování takovéto informace. V content editoru je tato databáze využívaná například v „Navigate -> Links“.

Princip

Link databáze jako taková je uložena v tabulce LINKS. Proces zápisu do této tabulky je založen na událostech, které jsou vyvolány při akcích s entitami.
Konkrétně se jedná o následující události:

  • item:copied
  • item:deleted
  • item:saved
  • item:versionRemoved

Při vyvolání jakékoliv z výše uvedených událostí dojde k zápisu do link databáze. Při vyvolání události item:deleted je dokonce možnost zvolit, co se má s existujícími vazbami na mazanou entitu provést. Jedná se o dialogové okno, které je vyvolané při mazání jakékoliv entity v Sitecore viz obrázek.

delete-link

V případě, že uživatel zvolí volbu „Leave links“, neprovede se korektní aktualizace v link databázi a tím dochází k nekonzistenci. Entity, které odkazovali na smazanou entitu budou nyní odkazovat na neexistující entitu. Pokud tedy uživatel nemá speciální důvod, měl by vždy nechat odstranit všechny linky na mazanou entitu tzn. vybrat volbu „Remove links“. Z důvodu případné nekonzistence link databáze je potřeba jednou za čas link databázi aktualizovat. Jakým způsobem se toto provádí, je popsáno v následující kapitole.

Správa

Z důvodu nekonzistence link databáze, potřebujeme někdy tuto databázi aktualizovat. Tato operace je v závislosti na počtu entit v Sitecore a počtu jazykových verzí časově velice náročnou operací. Proto je vhodné takovou aktualizaci provádět zásadně v nočních hodinách, kdy je systém minimálně zatížen. Celková doba aktualizace se může pohybovat u větších webů v hodinách. Tuto operaci lze ručně spustit v „Control Panel -> Database -> Rebuild the Link Database“ viz obrázek

rebuild-link-db

V dialogovém oknu můžeme zvolit, kterou databázi chceme aktualizovat. Nejčastěji potřebujeme aktualizovat master databázi, kde dochází k největšímu počtu změn. V případě, že trvá aktualizace link databáze příliš dlouho, je vhodné takovou operaci spouštět v jednom okamžiku vždy pouze pro jednu databázi.
V případě nutnosti pravidelné aktualizace link databáze je možné napsat vlastní job, který provede v naplánovaném termínu automatický rebuild databáze. V případě, že je rebuild jedné databáze značně časově náročný, lze job upravit tak, aby prováděl pravidelný rebuild pouze vydefinovaných částí stromu, konkrétních entit atp. Rebuild link databáze pro konkrétní entitu je možné provést následujícím kódem (rebuild /sitecore/content/Home):

   var dbName = "master"; 
   var db = Factory.GetDatabase(dbName);
   var item = db.GetItem("/sitecore/content/Home"); 
   Globals.LinkDatabase.UpdateReferences(item);

Možné způsoby konfigurace

Pomocí konfigurace je možné nastavit, do které databáze se bude link databáze ukládat. Jako výchozí nastavení Sitecore je ukládání do core databáze. Toto nastavení je možné změnit v závislosti na infrastruktuře konkrétního projektu. Nastavení se nachází v konfigurační souboru sitecore.config

<LinkDatabase type="Sitecore.Data.$(database).$(database)LinkDatabase, Sitecore.Kernel">
      <param connectionStringName="core"/>
</LinkDatabase>

Případný patch pro změnu databáze může být následující:

<LinkDatabase type="Sitecore.Data.$(database).$(database)LinkDatabase, Sitecore.Kernel">
          <param connectionStringName="web" patch:instead="param[@connectionStringName='core']" />
</LinkDatabase>

Pokud máme oddělený content management (CM) a content delivery (CD), je vhodné zvážit přesunutí link databáze pro CD do web db. Tím dochází k většímu oddělení CM a CD, což je velice výhodné.
Pokud máme možnost výrazně navýšit výkon pouze jedné databáze např. databáze master, která je na Azure, stojí v úvahu přesunout link databázi pro CM do master db místo core db.

Příklady práce s link databází

Rebuild link databáze:

   var dbName = "master"; 
   var db = Factory.GetDatabase(dbName);
   Globals.LinkDatabase.Rebuild(db);

Načtení všech referencí na /sitecore/content/Home:

   var dbName = "master"; 
   var db = Factory.GetDatabase(dbName);
   var item = db.GetItem("/sitecore/content/Home"); 
   ItemLink[] links = Globals.LinkDatabase.GetReferrers(item);