<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xml" href="/cjs/screen.xsl" media="screen"?>
<lecture>

<meta>
  <maintitle>Python – AXML</maintitle>
  <author>Jiří Znamenáček</author>
  <title>Databáze</title>
  <date>2010-10-21</date>
  <link><!--a href="http://vyuka.ookami.cz" rel="external">http://vyuka.ookami.cz</a--></link>
  <style>
      dd::before { content: '~ '; }
  </style>
</meta>


<slide title="K čemu databáze">

  <p>
    Mějme následující <a href="_files/structures.txt">structures.txt</a>:
  </p>
  <example lang="text">
7	MUIPLRMGAXZWSQ-FSHFIPFOCP	CCN1C=NC2=C1N=CN=C2N	9-ethylpurin-6-amine
11	WSLDOOZREJYCGB-UHFFFAOYAL	C(CCl)Cl	1,2-dichloroethane
12	RDJUHLUBPADHNP-UHFFFAOYAO	C1=C(C=C(C(=C1O)O)O)O	benzene-1,2,3,5-tetrol
13	PBKONEOXTCPAFI-UHFFFAOYAE	C1=CC(=C(C=C1Cl)Cl)Cl	1,2,4-trichlorobenzene
19	GLDQAMYCGOIJDV-KZFATGLACE	C1=CC(=C(C(=C1)O)O)C(=O)O	2,3-dihydroxybenzoic acid
33	QSKPIOLLBIHNAC-UHFFFAOYAP	C(C=O)Cl	2-chloroacetaldehyde
34	SZIFAVKTNFCBPC-UHFFFAOYAF	C(CCl)O	2-chloroethanol
...
  </example>
  <p>
    V jiné podobě tatáž data jako <a href="_files/structures.csv"> CSV-soubor</a>:
  </p>
  <example lang="text">
"7","9-ethylpurin-6-amine","MUIPLRMGAXZWSQ-FSHFIPFOCP","CCN1C=NC2=C1N=CN=C2N"
"11","1,2-dichloroethane","WSLDOOZREJYCGB-UHFFFAOYAL","C(CCl)Cl"
"12","benzene-1,2,3,5-tetrol","RDJUHLUBPADHNP-UHFFFAOYAO","C1=C(C=C(C(=C1O)O)O)O"
"13","1,2,4-trichlorobenzene","PBKONEOXTCPAFI-UHFFFAOYAE","C1=CC(=C(C=C1Cl)Cl)Cl"
"19","2,3-dihydroxybenzoic acid","GLDQAMYCGOIJDV-KZFATGLACE","C1=CC(=C(C(=C1)O)O)C(=O)O"
"33","2-chloroacetaldehyde","QSKPIOLLBIHNAC-UHFFFAOYAP","C(C=O)Cl"
"34","2-chloroethanol","SZIFAVKTNFCBPC-UHFFFAOYAF","C(CCl)O"
...
  </example>
  <p>
    O tomto souboru dat můžeme uvažovat jako o jakési primitivní databázi, ve které můžeme kupříkladu vyhledávat:
  </p>
  <example layout="vertical">
    <program src="_files/structures_v1.py" lang="python" />
    <out src="_files/structures.out" lang="text" />
  </example>
  <p>
    Ale vidíme, že to v podstatě znamená strukturu souboru pokaždé znovu načíst do paměti (rozložení na <em>id</em>, <em>inchikey</em>, <em>smiles</em>, <em>name</em>) a pro každé vyhledávání napsat smyčku přes všechny dostupné údaje. (Nemluvě o tom, že dané CSV by se navíc parsovalo ne tak přímočaře jako výše uvedený text.) Nešlo by to i nějak jinak?
  </p>

</slide>
<slide title="Databáze &amp; SQL">

  <p>
    Databáze (relační) jsou kolekce dat uspořádaných do tabulek, přičemž mezi jednotlivými tabulkami mohou (ale také nemusí) být různé vztahy.
  </p>
  <p>
    Přitom struktura jednotlivých tabulek je určena příslušným databázovým schématem. Např. tabulka z předchozího příkladu by mohla vypadat takto:
  </p>
  <table border="1" align="center" cellspacing="0" cellpadding="5">
    <tr>
        <th>id</th>
        <th>name</th>
        <th>inchikey</th>
        <th>smiles</th>
    </tr>
    <tr>
        <td>7</td>
        <td>9-ethylpurin-6-amine</td>
        <td>MUIPLRMGAXZWSQ-FSHFIPFOCP</td>
        <td>CCN1C=NC2=C1N=CN=C2N</td>
    </tr>
    <tr>
        <td>11</td>
        <td>1,2-dichloroethane</td>
        <td>WSLDOOZREJYCGB-UHFFFAOYAL</td>
        <td>C(CCl)Cl</td>
    </tr>
    <tr>
        <td>12</td>
        <td>benzene-1,2,3,5-tetrol</td>
        <td>RDJUHLUBPADHNP-UHFFFAOYAO</td>
        <td>C1=C(C=C(C(=C1O)O)O)O</td>
    </tr>
    <tr>
        <td>13</td>
        <td>1,2,4-trichlorobenzene</td>
        <td>PBKONEOXTCPAFI-UHFFFAOYAE</td>
        <td>C1=CC(=C(C=C1Cl)Cl)Cl</td>
    </tr>
    <tr>
        <td>19</td>
        <td>2,3-dihydroxybenzoic acid</td>
        <td>GLDQAMYCGOIJDV-KZFATGLACE</td>
        <td>C1=CC(=C(C(=C1)O)O)C(=O)O</td>
    </tr>
    <tr>
        <td>33</td>
        <td>2-chloroacetaldehyde</td>
        <td>QSKPIOLLBIHNAC-UHFFFAOYAP</td>
        <td>C(C=O)Cl</td>
    </tr>
    <tr>
        <td>34</td>
        <td>2-chloroethanol</td>
        <td>SZIFAVKTNFCBPC-UHFFFAOYAF</td>
        <td>C(CCl)O</td>
    </tr>
    <tr>
        <td colspan="4" align="center">...</td>
    </tr>
  </table>
  <p>
    Ohromnou výhodou (relačních) databází je, že jsou <em>specializovanými</em> nástroji na správu ohromného množství takto uspořádaných dat, přičemž jsou (většinou) vybaveny speciálním dotazovacím jazykem SQL (<em>Structured Query Language</em>), který slouží k výběru dat z databáze podle zadaného kritéria. Např. program z předchozího slajdu bychom v SQL zreprodukovali takto:
  </p>
  <example lang="sql">
SELECT * FROM structures
    WHERE name LIKE '%benzene%';
  </example>
  <p>
    Žádná smyčka přes všechny vstupní řádky, žádné rozdělování právě zpracovávané řádky na jednotlivé údaje… Prostě jen dotaz do databáze na tabulku s uvedenou podmínkou.
  </p>

</slide>
<slide title="Terminologie">

  <dl>
    <dt>relační databáze</dt>
        <dd>kolekce dat uspořádaných v tabulkách, mezi nimiž mohou být nějaké vztahy</dd>
        <dd>SQLite: jeden konkrétní soubor</dd>
    <dt>schéma</dt>
        <dd>struktura databáze popsaná pomocí nějakého formálního jazyka; obsahuje definice tabulek (včetně typů polí), vztahů mezi nimi, pohledů na ně, indexů, triggerů, funkcí apod.</dd>
        <dd>SQLite: příkaz <code>.schema</code> vrátí SQL použité pro vytvoření příslušné databáze</dd>
    <dt>řádka, sloupec, pole (<em>field</em>)</dt>
        <dd>řádka je nejmenší spolu související datová jednotka tabulky databáze; je složená z jednotlivých polí, jejichž typ je udán příslušnými sloupci dané tabulky</dd>
    <dt>primární klíč (<em>PK</em>)</dt>
        <dd>kombinace sloupců (často pouze jeden), která jedinečným způsobem identifikuje každý záznam (řádku)</dd>
    <dt>cizí klíč (<em>FK</em>)</dt>
        <dd>odkaz z jedné tabulky na primární klíč v tabulce jiné</dd>
    <dt>trigger</dt>
        <dd>kód (v interním programovacím jazyce příslušné databáze), který je proveden v reakci na vybrané události</dd>
        <dd>příklad: při změně hodnoty pole, které může být fulltextově prohledáváno, je daným triggerem upraven odpovídající index fulltextového vyhledávání</dd>
    <dt>pohled (<em>view</em>)</dt>
        <dd>specifický pohled na tabulky v databázi; je generován za běhu na požádání, neexistuje tedy jako „fyzická“ struktura</dd>
        <dd>příklad: znepřístupnění části dat běžným uživatelům, uspořádání (podle vybraného kriteria) řádek dané tabulky...</dd>
    <dt>transakce</dt>
        <dd>skupina operací nad databází, které se buď všechny úspěšně provedou nebo se nevykonají vůbec; slouží mimo jiné k zabránění vzniku nekonzistencí v datech tím, že  zaručuje, že všechny operace, které je třeba provést pro úspěšné vykonání nějakého úkonu, jsou opravdu všechny provedeny</dd>
    <dt>množina výsledků (<em>result set</em>)</dt>
        <dd>množina řádek výsledné tabulky z dotazu <code>SELECT</code>; kromě vlastních dat obsahuje i metainformace o nich (jako např. názvy a typy sloupců)</dd>
    <dt>index</dt>
        <dd>datová struktura sloužící převážně k urychlení vyhledávání v datech databáze</dd>
        <dd>příklad: fulltextové vyhledávání je implementováno pomocí indexů, protože je <em>mnohem</em> rychlejší vyhledávat v dedikované binární struktuře než v obecných textových polích</dd>
  </dl>
  <note>
    Volně podle <a href="http://zetcode.com/databases/sqlitetutorial/introduction/" class="external">Introduction to SQLite</a>.
  </note>

</slide>


</lecture>