Automatické vytvoření dokumentace k databázi s využitím nástroje SchemaSpy

10. 6. 2021
Doba čtení: 22 minut

Sdílet

 Autor: Depositphotos
Dnes se seznámíme s možnostmi nástroje SchemaSpy, který slouží k automatickému vytvoření dokumentace k databázi. V souvislosti s popisem SchemaSpy se seznámíme i s některými užitečnými metapříkazy terminálu psql.

Obsah

1. Automatické vytvoření dokumentace k databázi s využitím nástroje SchemaSpy

2. Vytvoření nové databáze v nástroji psql

3. Kostra jednoduché databáze s trojicí tabulek

4. Konstrukce tabulek s jejich zobrazením v psql

5. Instalace nástroje SchemaSpy

6. Přepínače používané nástrojem SchemaSpy

7. Spuštění SchemaSpy proti zvolené databázi s vygenerováním výsledků

8. Zobrazení vygenerované dokumentace

9. Vylepšení databáze – přidání deklarace primárních klíčů

10. Vytvoření databáze, automatický vznik indexů pro primární klíče

11. Opětovné spuštění SchemaSpy s vygenerováním výsledků

12. Třetí varianta databáze s cizími klíči

13. Vytvoření databáze, včetně cizích klíčů

14. Spuštění SchemaSpy a zobrazení změn v dokumentaci

15. Export dokumentace o databázi do formátu XML

16. Příloha: databáze podporované nástrojem SchemaSpy s požadovanými parametry

17. Skripty pro vytvoření tabulek

18. Odkazy na Internetu

1. Automatické vytvoření dokumentace k databázi s využitím nástroje SchemaSpy

Tvorba technické dokumentace k IT projektům je – alespoň pro většinu vývojářů – činnost, ze které nebývají právě nadšeni. Navíc má ručně tvořená dokumentace (a ostatně i samotné komentáře v programovém kódu) jednu nevýhodu: samovolně zastarává. Týká se to i dokumentace k databázím, takže mnohdy je jediným „zdrojem pravdy“ samotná databáze (popř. v lepším případě změnové skripty). Jedním z možných řešení tohoto problému jsou nástroje pro automatickou tvorbu dokumentace. V oblasti relačních databází je jedním z těchto projektů nástroj nazvaný SchemaSpy. Tento nástroj se dokáže připojit k existující databázi (tedy k onomu „zdroji pravdy“) a na základě jejího schématu vygenerovat dokumentaci ve formě sady HTML stránek. Navíc tento nástroj dokáže odhalit i slabá místa databáze, například neexistující indexy, tabulky s jediným sloupcem, tabulky, které lze normalizovat atd.

Poznámka: v následujících kapitolách se předpokládá, že databáze PostgreSQL je nainstalována na některém z dostupných počítačů a že uživatel k ní má přístupová práva. V demonstračních příkladech budeme používat uživatele postgres s heslem taktéž postgres, ovšem úprava pro jiného uživatele a/nebo heslo je pochopitelně triviální.

2. Vytvoření nové databáze v nástroji psql

Před odzkoušením možností nabízených nástrojem SchemaSpy si připravíme novou testovací databázi. K tomuto účelu použijeme standardní interaktivní terminál psql, který uživatelům nabízí pokročilé ovládání přes příkazovou řádku. Terminál spustíme příkazem psql a předáme mu jméno uživatele, který se přihlašuje:

$ psql -U postgres
 
Password for user postgres:
psql (9.6.22)
Type "help" for help.
 
postgres=#
Poznámka: takto se lze přihlásit k lokálně běžící databázi na standardním portu. Pokud se připojujete k nestandardnímu portu (PostgreSQL v Dockeru atd.) nebo ke vzdálenému stroji, je nutné použít volby -h a -p.

Po úspěšném přihlášení vytvoříme novou databázi nazvanou test1, a to konkrétně následujícím příkazem:

postgres=# create database test1
 
CREATE DATABASE

Dále si necháme vypsat seznam všech dostupných databází s využitím takzvaného metapříkazu \l:

postgres=# \l

Výsledek může vypadat takto:

                                   List of databases
     Name     |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
--------------+----------+----------+-------------+-------------+-----------------------
 postgres     | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 ptisnovs     | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres           +
              |          |          |             |             | postgres=CTc/postgres
 template1    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres           +
              |          |          |             |             | postgres=CTc/postgres
 test1        | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
(5 rows)
Poznámka: samozřejmě je možné, že se vám vypíšou odlišné řádky, nicméně databáze test1 by se zde měla vyskytovat.

Metapříkazem \c se přepneme do vybrané databáze:

postgres=# \c test1
 
You are now connected to database "test1" as user "postgres".

3. Kostra jednoduché databáze s trojicí tabulek

Nyní se můžeme podívat na kostru velmi jednoduché databáze s trojicí tabulek. Struktura této databáze byla inspirována databází Employees Test Database, pouze jsem použil nezkrácená jména tabulek a jednotlivých sloupců (popravdě nevidím jediný důvod, proč toto zkracování někdo provádí, a to zrovna v jazyku SQL, který by měl být čitelný primárně pro lidi):

CREATE TABLE department (
   ID       integer NOT NULL,
   name     varchar(20) NOT NULL,
   location varchar(20) NOT NULL
);
 
CREATE TABLE employee (
   ID         integer NOT NULL,
   name       varchar(20) NOT NULL,
   job        varchar(20) NOT NULL,
   manager    integer,
   hiredate   date NOT NULL,
   salary     integer NOT NULL,
   comment    integer,
   department integer NOT NULL
);
 
CREATE TABLE project (
   ID        integer NOT NULL,
   employee  integer NOT NULL,
   startdate date NOT NULL,
   enddate   date NOT NULL
);
Poznámka: jednotlivé tabulky neobsahují deklarace primárních ani cizích klíčů. Ovšem nelekejte se, protože tyto údaje přidáme v rámci dalších dvou testovacích databází. Tím, že klíče nejsou uvedeny, otestujeme některé vlastnosti nástroje SchemaSpy, zejména jeho schopnost označit některé problematické části návrhu databáze.

4. Konstrukce tabulek s jejich zobrazením v psql

Soubor se specifikací tabulek, jehož obsah byl uveden v předchozí kapitole, se jmenuje db1.sql. V případě, že se tento soubor nachází v pracovním adresáři (cwd – current working directory), lze ho načíst přímo do interaktivního terminálu psql metapříkazem \i:

test1-# \i db1.sql
 
CREATE TABLE
CREATE TABLE
CREATE TABLE

Předchozí metapříkaz po svém spuštění vypsal pouze tři informace „CREATE TABLE“, což znamená, že tabulky by měly být vytvořeny. O tom se ostatně můžeme snadno přesvědčit, a to s využitím dalšího metapříkazu \dt:

test1-# \dt
 
           List of relations
 Schema |    Name    | Type  |  Owner
--------+------------+-------+----------
 public | department | table | postgres
 public | employee   | table | postgres
 public | project    | table | postgres
(3 rows)

Zobrazit si můžeme i strukturu jednotlivých tabulek, a to metapříkazem \d:

test1-# \d employee
 
            Table "public.employee"
   Column   |         Type          | Modifiers
------------+-----------------------+-----------
 id         | integer               | not null
 name       | character varying(20) | not null
 job        | character varying(20) | not null
 manager    | integer               |
 hiredate   | date                  | not null
 salary     | integer               | not null
 comment    | integer               |
 department | integer               | not null

Druhá tabulka:

test1-# \d department
 
          Table "public.department"
  Column  |         Type          | Modifiers
----------+-----------------------+-----------
 id       | integer               | not null
 name     | character varying(20) | not null
 location | character varying(20) | not null

Třetí tabulka:

test1-# \d project
 
     Table "public.project"
  Column   |  Type   | Modifiers
-----------+---------+-----------
 id        | integer | not null
 employee  | integer | not null
 startdate | date    | not null
 enddate   | date    | not null

Nyní je testovací databáze připravena, takže můžeme interaktivní prostředí terminálu psql ukončit:

test1-# \q

5. Instalace nástroje SchemaSpy

Po přípravě testovací databáze je nutné nainstalovat nástroj SchemaSpy. Ve skutečnosti ovšem není plnohodnotná instalace zapotřebí, protože pouze dostačuje provést dva kroky:

  1. Stáhnout Java archiv (JAR) s nástrojem SchemaSpy
  2. Stáhnout JDBC ovladač pro databázi PostgreSQL (JDBC je standardní rozhraní nezávislé na konkrétní databázi, v důsledku ovšem musí komunikovat s konkrétní databází)

Poslední stabilní verzi nástroje SchemaSpy naleznete na stránce https://github.com/schemas­py/schemaspy/releases/tag/v6­.1.0. Vyberte soubor pojmenovaný schemaspy-6.1.0.jar a ten si stáhněte do pracovního adresáře.

Z adresy https://jdbc.postgresql.or­g/download.html si do stejného adresáře stáhněte JDBC ovladač pro databázi PostgreSQL. K dispozici jsou varianty pro tři verze virtuálních strojů a běhových prostředí Javy – JRE 6, JRE 7 a všech novějších JRE.

6. Přepínače používané nástrojem SchemaSpy

Nástroj SchemaSpy podporuje několik desítek přepínačů, ovšem pouze devět z nich je skutečně vyžadováno při práci s databází PostgreSQL. Jedná se o následující přepínače (které využijeme v navazující kapitole):

postgres
# Přepínač Význam přepínače Hodnota v příkladu
1 -t typ databáze psql
2 -u uživatelské jméno pro přihlášení do DB postgres
3 -p heslo pro přihlášení do DB
4 -host jméno počítače, na kterém databáze běží localhost
5 -port port, na kterém databáze běží je použita výchozí hodnota
6 -s jméno schématu public
7 -o adresář, do kterého se budou generovat výsledky test1/test2/test3
8 -db jméno databáze, která se zkoumá test1/test2/test3
9 -dp cesta k JDBC ovladači PostgreSQL postgresql-42.2.20.jre7.jar
Poznámka: schéma pro přepínač -s získáte přímo z interaktivního terminálu psql následujícím způsobem:
postgres=# \dn
 
  List of schemas
  Name  |  Owner
--------+----------
 public | postgres
(1 row)

7. Spuštění SchemaSpy proti zvolené databázi s vygenerováním výsledků

Informace o přepínačích, které byly uvedeny v předchozí kapitole, nyní použijeme pro spuštění nástroje SchemaSpy oproti databázi nazvané test1, již jsme vytvořili v rámci předchozích kroků. Vzhledem k tomu, že SchemaSpy je dodávána ve formě Java archivu (JAR), provede se spuštění přes java -jar (a ve stejném adresáři by měl být umístěn i Java archiv s JDBC ovladačem pro PostgreSQL):

$ java -jar schemaspy-6.1.0.jar -cp . -t pgsql -u postgres -p postgres -host localhost -s public -o test1 -db test1 -dp postgresql-42.2.20.jre7.jar

V případě, že PostgreSQL běží a databáze test1 existuje (měla by), zobrazí se na standardním výstupu postup získávání informací o této databázi i o vytváření výsledků, které budou umístěny do podadresáře pojmenovaného taktéž test1:

  ____       _                          ____
 / ___|  ___| |__   ___ _ __ ___   __ _/ ___| _ __  _   _
 \___ \ / __| '_ \ / _ \ '_ ` _ \ / _` \___ \| '_ \| | | |
  ___) | (__| | | |  __/ | | | | | (_| |___) | |_) | |_| |
 |____/ \___|_| |_|\___|_| |_| |_|\__,_|____/| .__/ \__, |
                                             |_|    |___/
 
                                              6.1.0
 
SchemaSpy generates an HTML representation of a database schema's relationships.
SchemaSpy comes with ABSOLUTELY NO WARRANTY.
SchemaSpy is free software and can be redistributed under the conditions of LGPL version 3 or later.
http://www.gnu.org/licenses/
 
INFO  - Starting Main v6.1.0 on localhost.localdomain with PID 17134 (/tmp/ramdisk/schemaspy-6.1.0.jar started by ptisnovs in /tmp/ramdisk)
INFO  - The following profiles are active: default
INFO  - Started Main in 1.543 seconds (JVM running for 2.118)
INFO  - Starting schema analysis
INFO  - Connected to PostgreSQL - 9.6.22
INFO  - Gathering schema details
Gathering schema details......(0sec)
Connecting relationships......(0sec)
Writing/graphing summary.INFO  - Gathered schema details in 0 seconds
INFO  - Writing/graphing summary
INFO  - Graphviz rendered set to ''
........(0sec)
Writing/diagramming detailsINFO  - Completed summary in 0 seconds
INFO  - Writing/diagramming details
...(0sec)
Wrote relationship details of 3 tables/views to directory 'test1' in 1 seconds.
View the results by opening test1/index.html
INFO  - Wrote table details in 0 seconds
INFO  - Wrote relationship details of 3 tables/views to directory 'test1' in 1 seconds.
INFO  - View the results by opening test1/index.html

8. Zobrazení vygenerované dokumentace

Dokumentace, která byla vygenerována nástrojem SchemaSpy pro naši první testovací databázi, je dostupná na adrese https://tisnik.github.io/pre­sentations/coffee-talks/schemaspy/db1/index.html. Nyní se podívejme na nejzajímavější části této dokumentace. Na listu Tables (což je výchozí list) se zobrazují jak jednotlivé tabulky, tak i pohledy (pochopitelně pokud v databázi existují). List Constraints je prozatím prázdný, stejně jako list Relationships – důvodem je fakt, že v databázi nejsou definovány klíče. Právě z tohoto důvodu jsou všechny tabulky zobrazeny na listu Orphan Tables:

Obrázek 1: „Osamělá“ tabulka department.

Obrázek 2: „Osamělá“ tabulka employee.

Obrázek 3: „Osamělá“ tabulka project.

Důležitý je list Anomalies, který obsahuje seznam všech potenciálních problémů, které nástroj SchemaSpy dokázal detekovat. V našem konkrétním případě nám nástroj říká, že ani jedna tabulka neobsahuje indexy. K tomuto listu se vrátíme v dalších kapitolách.

9. Vylepšení databáze – přidání deklarace primárních klíčů

Databázi nyní vylepšíme, resp. přesněji řečeno vytvoříme novou databázi nazvanou test2, která bude vylepšenou obdobou databáze původní. Konkrétně do všech třech tabulek přidáme deklarace primárních klíčů. V případě testovací databáze se bude jednat o jednoduché (nikoli tedy složené) klíče představované sloupcem ID:

CREATE TABLE department (
   ID       serial PRIMARY KEY,
   name     varchar(20) NOT NULL,
   location varchar(20) NOT NULL
);
 
CREATE TABLE employee (
   ID         serial PRIMARY KEY,
   name       varchar(20) NOT NULL,
   job        varchar(20) NOT NULL,
   manager    integer,
   hiredate   date NOT NULL,
   salary     integer NOT NULL,
   comment    integer,
   department integer NOT NULL
);
 
CREATE TABLE project (
   ID        serial PRIMARY KEY,
   employee  integer NOT NULL,
   startdate date NOT NULL,
   enddate   date NOT NULL
);

10. Vytvoření databáze, automatický vznik indexů pro primární klíče

Databázi představovanou výše zmíněnou trojicí tabulek opět vytvoříme s využitím interaktivního terminálu psql. Postup je naprosto stejný, jako tomu bylo v prvním demonstračním příkladu:

$ psql -U postgres
 
Password for user postgres:
psql (9.6.22)
Type "help" for help.
 
postgres=# create database test2;
 
CREATE DATABASE
 
postgres=# \l
                                   List of databases
     Name     |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
--------------+----------+----------+-------------+-------------+-----------------------
 postgres     | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 ptisnovs     | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
              |          |          |             |             | postgres=CTc/postgres
 template1    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
              |          |          |             |             | postgres=CTc/postgres
 test1        | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 test2        | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
(6 rows)
 
postgres=# \c test2
 
You are now connected to database "test2" as user "postgres".

Databáze byla vytvořena, takže načteme a spustíme skript, který v ní vytvoří i všechny tři tabulky:

test2=# \i db2.sql
 
CREATE TABLE
CREATE TABLE
CREATE TABLE
 
test2=# \dt
           List of relations
 Schema |    Name    | Type  |  Owner
--------+------------+-------+----------
 public | department | table | postgres
 public | employee   | table | postgres
 public | project    | table | postgres
(3 rows)

Tabulky skutečně existují, takže se podívejme, jak jsou nyní v databázi uloženy:

test2=# \d employee
 
                                  Table "public.employee"
   Column   |         Type          |                       Modifiers
------------+-----------------------+-------------------------------------------------------
 id         | integer               | not null default nextval('employee_id_seq'::regclass)
 name       | character varying(20) | not null
 job        | character varying(20) | not null
 manager    | integer               |
 hiredate   | date                  | not null
 salary     | integer               | not null
 comment    | integer               |
 department | integer               | not null
Indexes:
    "employee_pkey" PRIMARY KEY, btree (id)
 
test2=# \d department
 
                                 Table "public.department"
  Column  |         Type          |                        Modifiers
----------+-----------------------+---------------------------------------------------------
 id       | integer               | not null default nextval('department_id_seq'::regclass)
 name     | character varying(20) | not null
 location | character varying(20) | not null
Indexes:
    "department_pkey" PRIMARY KEY, btree (id)
 
test2=# \d project
 
                           Table "public.project"
  Column   |  Type   |                      Modifiers
-----------+---------+------------------------------------------------------
 id        | integer | not null default nextval('project_id_seq'::regclass)
 employee  | integer | not null
 startdate | date    | not null
 enddate   | date    | not null
Indexes:
    "project_pkey" PRIMARY KEY, btree (id)
Poznámka: povšimněte si podtržených řádků. Je z nich patrné, že se pro primární klíče automaticky vytvořily i indexy.

11. Opětovné spuštění SchemaSpy s vygenerováním výsledků

Nyní si necháme vygenerovat dokumentaci i ke druhé testovací databázi, která byla vytvořena v rámci předchozích dvou kapitol. Postup je stále stejný, pouze změníme jméno databáze a taktéž jméno adresáře, do něhož se dokumentace vygeneruje:

$ java -jar schemaspy-6.1.0.jar -cp . -u postgres -t pgsql -p postgres -o test2 -host localhost -db test2 -dp postgresql-42.2.20.jre7.jar -s public
 
  ____       _                          ____
 / ___|  ___| |__   ___ _ __ ___   __ _/ ___| _ __  _   _
 \___ \ / __| '_ \ / _ \ '_ ` _ \ / _` \___ \| '_ \| | | |
  ___) | (__| | | |  __/ | | | | | (_| |___) | |_) | |_| |
 |____/ \___|_| |_|\___|_| |_| |_|\__,_|____/| .__/ \__, |
                                             |_|    |___/
 
                                              6.1.0
 
SchemaSpy generates an HTML representation of a database schema's relationships.
SchemaSpy comes with ABSOLUTELY NO WARRANTY.
SchemaSpy is free software and can be redistributed under the conditions of LGPL version 3 or later.
http://www.gnu.org/licenses/
 
INFO  - Starting Main v6.1.0 on localhost.localdomain with PID 18080 (/tmp/ramdisk/schemaspy-6.1.0.jar started by ptisnovs in /tmp/ramdisk)
INFO  - The following profiles are active: default
INFO  - Started Main in 1.674 seconds (JVM running for 2.293)
INFO  - Starting schema analysis
INFO  - Connected to PostgreSQL - 9.6.10
INFO  - Gathering schema details
Gathering schema details......(0sec)
Connecting relationships......(0sec)
Writing/graphing summary.INFO  - Gathered schema details in 0 seconds
INFO  - Writing/graphing summary
INFO  - Graphviz rendered set to ''
........(0sec)
Writing/diagramming detailsINFO  - Completed summary in 0 seconds
INFO  - Writing/diagramming details
...(0sec)
Wrote relationship details of 3 tables/views to directory 'test2' in 1 seconds.
View the results by opening test2/index.html
INFO  - Wrote table details in 0 seconds
INFO  - Wrote relationship details of 3 tables/views to directory 'test2' in 1 seconds.
INFO  - View the results by opening test2/index.html

Výsledek je dostupný na adrese https://tisnik.github.io/pre­sentations/coffee-talks/schemaspy/db2/index.html. Pokud přejdete na list Anomalies, je patrné, že se již nevypisuje informace o chybějících indexech.

12. Třetí varianta databáze s cizími klíči

Podívejme se nyní na třetí a současně i poslední variantu databáze, nyní doplněné o cizí klíče. Zajímavá je situace v tabulce employee, protože manažer nějakého zaměstnance je taktéž zaměstnanec, takže tento cizí klíč odkazuje na stejnou tabulku:

CREATE TABLE department (
   ID       integer NOT NULL,
   name     varchar(20) NOT NULL,
   location varchar(20) NOT NULL,
 
   PRIMARY KEY (ID)
);
 
CREATE TABLE employee (
   ID         integer NOT NULL,
   name       varchar(20) NOT NULL,
   job        varchar(20) NOT NULL,
   manager    integer,
   hiredate   date NOT NULL,
   salary     integer NOT NULL,
   comment    integer,
   department integer NOT NULL,
 
   PRIMARY KEY (ID),
   CONSTRAINT fk_manager FOREIGN KEY (manager) REFERENCES employee (ID)
      ON DELETE SET NULL
      ON UPDATE CASCADE,
   CONSTRAINT fk_department FOREIGN KEY (department) REFERENCES department (ID)
      ON DELETE RESTRICT
      ON UPDATE NO ACTION
);
 
CREATE TABLE project (
   ID        integer NOT NULL,
   employee  integer NOT NULL,
   startdate date NOT NULL,
   enddate   date NOT NULL,
 
   PRIMARY KEY (ID),
   CONSTRAINT fk_project FOREIGN KEY (employee) REFERENCES employee (ID)
      ON DELETE NO ACTION
      ON UPDATE CASCADE
);

13. Vytvoření databáze, včetně cizích klíčů

Databázi vytvoříme podobně, jako předchozí dvě databáze, takže si jen ukažme jednotlivé operace bez jejich podrobnějšího procesu:

$ psql -U postgres
 
Password for user postgres:
psql (9.6.22)
Type "help" for help.
 
postgres=# create database test3;
 
CREATE DATABASE
test3=# \i db3.sql
CREATE TABLE
CREATE TABLE
CREATE TABLE
 
test3=# \dt
           List of relations
 Schema |    Name    | Type  |  Owner
--------+------------+-------+----------
 public | department | table | postgres
 public | employee   | table | postgres
 public | project    | table | postgres
(3 rows)
 
test3=# \d employee
            Table "public.employee"
   Column   |         Type          | Modifiers
------------+-----------------------+-----------
 id         | integer               | not null
 name       | character varying(20) | not null
 job        | character varying(20) | not null
 manager    | integer               |
 hiredate   | date                  | not null
 salary     | integer               | not null
 comment    | integer               |
 department | integer               | not null
Indexes:
    "employee_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
    "fk_department" FOREIGN KEY (department) REFERENCES department(id) ON DELETE RESTRICT
    "fk_manager" FOREIGN KEY (manager) REFERENCES employee(id) ON UPDATE CASCADE ON DELETE SET NULL
Referenced by:
    TABLE "employee" CONSTRAINT "fk_manager" FOREIGN KEY (manager) REFERENCES employee(id) ON UPDATE CASCADE ON DELETE SET NULL
    TABLE "project" CONSTRAINT "fk_project" FOREIGN KEY (employee) REFERENCES employee(id) ON UPDATE CASCADE
 
test3=# \d employee
            Table "public.employee"
   Column   |         Type          | Modifiers
------------+-----------------------+-----------
 id         | integer               | not null
 name       | character varying(20) | not null
 job        | character varying(20) | not null
 manager    | integer               |
 hiredate   | date                  | not null
 salary     | integer               | not null
 comment    | integer               |
 department | integer               | not null
Indexes:
    "employee_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
    "fk_department" FOREIGN KEY (department) REFERENCES department(id) ON DELETE RESTRICT
    "fk_manager" FOREIGN KEY (manager) REFERENCES employee(id) ON UPDATE CASCADE ON DELETE SET NULL
Referenced by:
    TABLE "employee" CONSTRAINT "fk_manager" FOREIGN KEY (manager) REFERENCES employee(id) ON UPDATE CASCADE ON DELETE SET NULL
    TABLE "project" CONSTRAINT "fk_project" FOREIGN KEY (employee) REFERENCES employee(id) ON UPDATE CASCADE
 
test3=# \d project
     Table "public.project"
  Column   |  Type   | Modifiers
-----------+---------+-----------
 id        | integer | not null
 employee  | integer | not null
 startdate | date    | not null
 enddate   | date    | not null
Indexes:
    "project_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
    "fk_project" FOREIGN KEY (employee) REFERENCES employee(id) ON UPDATE CASCADE

14. Spuštění SchemaSpy a zobrazení změn v dokumentaci

Vygenerování dokumentace ke třetí variantě databáze:

$ java -jar schemaspy-6.1.0.jar -cp . -u postgres -t pgsql -p postgres -o test3 -host localhost -db test3 -dp postgresql-42.2.20.jre7.jar -s public

Výsledek je dostupný na adrese https://tisnik.github.io/pre­sentations/coffee-talks/schemaspy/db3/index.html. Nyní je již vyplněn list Constraints s informacemi o cizích klíčích. Taktéž došlo ke změnám na listu Relationships, protože tabulky jsou svázány přes cizí klíče:

Obrázek 4: Tabulky svázané přes trojici cizích klíčů.

15. Export dokumentace o databázi do formátu XML

Dokumentaci o databázi lze uložit do formátu XML. Ve skutečnosti se toto XML generuje vždy současně s tvorbou HTML stránek, ovšem HTML výstup lze zakázat volbou -nohtml (což se hodí například pro CI):

$ java -jar schemaspy-6.1.0.jar -cp . -nohtml -u postgres -t pgsql -p postgres -o test3 -host localhost -db test3 -dp postgresql-42.2.20.jre7.jar -s public
 
  ____       _                          ____
 / ___|  ___| |__   ___ _ __ ___   __ _/ ___| _ __  _   _
 \___ \ / __| '_ \ / _ \ '_ ` _ \ / _` \___ \| '_ \| | | |
  ___) | (__| | | |  __/ | | | | | (_| |___) | |_) | |_| |
 |____/ \___|_| |_|\___|_| |_| |_|\__,_|____/| .__/ \__, |
                                             |_|    |___/
 
                                              6.1.0
 
SchemaSpy generates an HTML representation of a database schema's relationships.
SchemaSpy comes with ABSOLUTELY NO WARRANTY.
SchemaSpy is free software and can be redistributed under the conditions of LGPL version 3 or later.
http://www.gnu.org/licenses/
 
INFO  - Starting Main v6.1.0 on localhost.localdomain with PID 13998 (/tmp/ramdisk/schemaspy-6.1.0.jar started by ptisnovs in /tmp/ramdisk)
INFO  - The following profiles are active: default
INFO  - Started Main in 1.125 seconds (JVM running for 1.567)
INFO  - Starting schema analysis
INFO  - Gathering schema details

V tomto případě bude výsledkem adresář test3 s trojicí souborů:

$ ls -l test3
 
total 16
-rw-rw-r--. 1 ptisnovs ptisnovs   28 Jun  9 19:56 deletionOrder.txt
-rw-rw-r--. 1 ptisnovs ptisnovs   28 Jun  9 19:56 insertionOrder.txt
-rw-rw-r--. 1 ptisnovs ptisnovs 4206 Jun  9 19:56 test3.public.xml

Důležitý je právě poslední soubor s definicí databázového schématu, jenž je možné dále zpracovat prakticky libovolným XML procesorem.

16. Příloha: databáze podporované nástrojem SchemaSpy s požadovanými parametry

Podporované databáze i přepínače, které je nutné použít pro připojení, lze získat následovně:

bitcoin_skoleni

$ java -jar schemaspy-6.1.0.jar -dbhelp

Výsledky:

IBM DB2 with the 'App' Driver (-t db2)
   -db                  database name
IBM DB2 for i (former as400) driver (-t db2i)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database SID as known on host
IBM DB2 with the Type 4 'Net' Driver (-t db2net)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
IBM DB2 for z/OS with the 'App' Driver (-t db2zos)
   -db                  database name
IBM DB2/zos with the Type 4 'Net' Driver (-t db2zosnet)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
Derby Embedded Server (-t derby)
   -db                  path to database
Derby Network Server (-t derbynet)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
Firebird (-t firebird)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
Force (-t force)
H2 Server (-t h2)
   -db                  database name
Hive (-t hive)
   -host                database host
   -port                database port
   -db                  database name
Hive with keytab support (-t hive-kerberos-driverwrapper)
   -host                database host
   -port                database port
   -db                  database name
   -principal                   the principal to use
Hive with keytab support configured for service discovery using zookeeper (-t hive-kerberos-driverwrapper-zookeeper)
   -host                database host
   -port                database port
   -db                  database name
HSQLDB Server (-t hsqldb)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
Imapla (-t impala)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
InformixSQL (-t informix)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
   -server              database server
Microsoft SQL Server JTDS (-t jtds)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
MariaDB (-t mariadb)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
MaxDB (-t maxdb)
   -host                Name of the computer on which the database instance is running
   -db                  Name of database instance
Microsoft SQL Server (-t mssql)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
jTDS JDBC Driver for Microsoft SQL 2000/2005 Server  (-t mssql-jtds)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
jTDS JDBC Driver for Microsoft SQL 2000/2005 Server  (-t mssql-jtds-instance)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
   -instance            Named instance to connect to
Microsoft SQL Server 2005+ (-t mssql05)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
jTDS JDBC Driver for Microsoft SQL 2000/2005 Server  (-t mssql05-jtds)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
jTDS JDBC Driver for Microsoft SQL 2000/2005 Server  (-t mssql05-jtds-instance)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
   -instance            Named instance to connect to
Microsoft SQL Server 2008+ (-t mssql08)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
jTDS JDBC Driver for Microsoft SQL Server 2008+ (-t mssql08-jtds)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
jTDS JDBC Driver for Microsoft SQL Server 2008+ (-t mssql08-jtds-instance)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
   -instance            Named instance to connect to
MySQL (-t mysql)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
MySQL (-t mysql-socket)
   -host                host where database resides with optional port
   -db                  database name
   -socketFactory               ClassName of socket factory which must be in your classpath
   -socket              Path To Socket
Netezza (-t netezza)
   -host                host of database, may contain port
   -port                optional port if not default
   -db
Oracle with OCI8 Driver (-t ora)
   -db                  database name (from TNSNAMES.ORA)
Oracle with Thin Driver (-t orathin)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database SID as known on host
Oracle with Thin Driver (-t orathin-service)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database (service) as known on host
PostgreSQL (-t pgsql)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
PostgreSQL (-t pgsql11)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
Amazon redshift (-t redshift)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
Snowflake (-t snowflake)
   -account             hostname before 'snowflakecomputing.com'
   -role                Snowflake user role
   -warehouse                   Snowflake warehouse
   -db
SQLite (-t sqlite)
   -db                  path to database or :memory:
SQLite (-t sqlite-xerial)
   -db                  path to database or :memory:
Sybase Server (jdbc3) (-t sybase)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
Sybase Server (jdbc2) (-t sybase2)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name
Sybase Server (jdbc4) (-t sybase3)
   -host                database server host
   -port                database port on host
   -db                  database name
Teradata (-t teradata)
   -db                  database name
   -s                   ?????
   -port                ?????
DB2 UDB Type 4 Driver (-t udbt4)
   -host                host of database, may contain port
   -port                optional port if not default
   -db                  database name

17. Skripty pro vytvoření tabulek

Skripty určené pro vytvoření tabulek ve třech demonstračních databázích byly uloženy do Git repositáře, který je dostupný na adrese https://github.com/tisnik/pre­sentations. Odkazy na jednotlivé skripty naleznete v následující tabulce:

# Skript Stručný popis skriptu Cesta
1 db1.sql kostra jednoduché databáze s trojicí tabulek https://github.com/tisnik/pre­sentations/blob/master/Sche­maSpy/db1.sql
2 db2.sql přidání primárních klíčů do databáze https://github.com/tisnik/pre­sentations/blob/master/Sche­maSpy/db2.sql
3 db3.sql přidání cizích klíčů do databáze https://github.com/tisnik/pre­sentations/blob/master/Sche­maSpy/db3.sql

18. Odkazy na Internetu

  1. Employees Test Database
    https://github.com/cristiscu/employees-test-database
  2. SchemaSpy home page
    http://schemaspy.org/](http://sche­maspy.org/
  3. SchemaSpy (verze pro starší JVM)
    http://schemaspy.sourceforge.net/
  4. SchemaSpy na GitHubu
    https://github.com/schemas­py/schemaspy
  5. SchemaSpy download page
    https://github.com/schemas­py/schemaspy/releases/tag/v6­.1.0
  6. SchemaSpy on PostgreSQL wiki
    https://wiki.postgresql.or­g/wiki/SchemaSpy
  7. SchemaSpy Documentation
    https://schemaspy.readthe­docs.io/_/downloads/en/la­test/pdf/
  8. PostgreSQL JDBC driver download page
    https://jdbc.postgresql.or­g/download.html
  9. PostgreSQL Primary Key
    https://www.postgresqltuto­rial.com/postgresql-primary-key/
  10. PostgreSQL Foreign Key
    https://www.postgresqltuto­rial.com/postgresql-foreign-key/
  11. psql man page
    https://linux.die.net/man/1/psql
  12. GraphViz Pocket Reference
    https://graphs.grevian.org/example
  13. graphviz(3) – Linux man page
    https://linux.die.net/man/3/graphviz
  14. dot(1) – Linux man page
    https://linux.die.net/man/1/dot
  15. neato(1) – Linux man page
    https://linux.die.net/man/1/neato
  16. twopi(1) – Linux man page
    https://linux.die.net/man/1/twopi
  17. circo(1) – Linux man page
    https://linux.die.net/man/1/circo
  18. fdp(1) – Linux man page
    https://linux.die.net/man/1/fdp
  19. sfdp(1) – Linux man page
    https://linux.die.net/man/1/sfdp
  20. Graphviz – Graph Visualization Software
    http://www.graphviz.org/
  21. graphviz (Manual Page)
    http://www.root.cz/man/7/graphviz/

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.