Warning: Declaration of Suffusion_MM_Walker::start_el(&$output, $item, $depth, $args) should be compatible with Walker_Nav_Menu::start_el(&$output, $item, $depth = 0, $args = Array, $id = 0) in /DISK2/WWW/plsql.cz/www/wp-content/themes/suffusion/library/suffusion-walkers.php on line 0
Jan 232014
 

První díl: Workoutlog v APEXu – hezky od začátku #1 – úvod
Druhý díl: Workoutlog v APEXu – hezky od začátku #2 – návrh datové vrstvy(1)

Původně jsem chtěl v tomto díle dát na stáhnutí schéma a ddl. A pak začít s nějakou kritikou návrhu – co tam není úplně podle normálních forem a best practices apod. Nicméně při dokreslování relací jsem zjistil, že tabulku kterou jsem si smazal jsem si smazal nesprávně. Inu doplňuji datový model dokonce o dvě další entity bez kterých by to nešlo (alespoň bez té první) a jeden atribut:

Entita #12 – TBL_WOD_CIRCLE_LIST – analogie TBL_WORKOUT_LIST a TBL_WORKOUT_LIST. Záznam všech WOD/kruhových cvičení v rámci jednoho cvičení.

  • ID_WOD_CIRCLE_LIST (NUMBER(9)) - Primární klíč generovaný ze sekvence
  • CROSSFIT_WOD_LOV_ID (NUMER(9)) – Odkaz do tabulky z definicí WOD a kruhových cvičení
  • WORKOUT_ID (NUMBER(9)) – Odkaz do master tabulky se záznamem o cvičeních
  • WOD_START (DATE) – Kdy se začalo cvičit
  • WOD_END (DATE) – Dokončení WOD
  • NUMBER_OF_ROUNDS (NUMBER(4)) – Počet dosažených kol AMRAP
  • FAILED (NUMBER(1)) – V případě, že uživatel cvičení nezvládne
  • NOTE (VARCHAR2(2000)) – Poznámka

Entita #13 – TBL_WOD_CIRCLE_SERIE – Záznam pro jednotlivé série ve WOD či kruhovém cvičení – čekám, že nebude potřeba pro všechna WOD, ale občas je fajn to umět odtrackovat

  • ID_WOD_CIRCLE_SERIE (NUMBER(9)) – Primární klíč generovaný ze sekvence
  • WOD_CIRCLE_SERIE_ORDER (NUMBER(9)) – Pořadí v kruhovém cvičení
  • WOD_CIRCLE_LIST_ID (NUMBER(9)) – Cizí klíč, odkaz do tabulky TBL_WOD_CIRCLE_LIST
  • COUNT (NUMBER(9)) – Počet cviků
  • STARTED (DATE) – Začátek serie
  • ENDED (DATE) - Konec série
  • NOTE (VARCHAR2(2000)) – Případná moznámka

A doplnil jsem atribut do tabulky TBL_WORKOUT_LOV s názvem TIME_REST_DEGRESSION (VARCHAR2(2000)). Nedávno jsem viděl na youtube video bývalého profesionálního mistra republiky v kulturistice a ten tvrdil, že mezi všemi sériemi při zvedání činek má být stejná pauza. Nesouhlasím ;) Imho by neměla být delší, ale nevidím důvod jí na konci nezredkuovat jako dopump. Jinak takticky VARCHAR2 – ještě nevím, co tam přijde těch možností je spoustu a než nějaká nastavení z deseti sloupci tak jeden v kterém třeba může být nějaký sofistikovaný PL/SQL  výpočet ;)

Takový rychlý high-level pohled na datovou vrstvu, je následující. TBL_WORKOUT je tabulka (master) ve které budou záznamy se cvičením (cvičil jsem v 16.1.2002..), hierarchicky pod ní jsou tabulky TABATA, a *_LIST se záznamy jednotlivých izolovaných prováděných cviků (floor press, TABATA – kliky..) a v rámci toho – hierarchicky pod – jsou tabulky *_SERIE, každý řádek pro opakování jednoho cviku bez přestávky. *_LOV jsou čistě číselníky.

Model níže na stáhnutí je v Oracle SQL Data Modeler 4.0. Musím říct, že Oracle udělal spoustu užitečných změnt v Data Modeleru a přidal spoustu vylepšení od doby, kdy jsem ho viděl naposledy. A rozhodně to není takové ořezávátko, jako byl ještě před pár lety. Potěšující je plná podpora Oracle 12c, snad všechny storage parametry tabulek. Nicméně po krátké zkušenosti mi vadí například vygenerovaný název pro FK delší než 30 znaků (chyba až při generování DDL), všimnul jsem si možnosti komentářů pro constrainy pro DB (nic takového Oracle nepodporuje – imho pro nedoménové indexy, constrainy, cizí klíče by to mělo být disable). Ale snad ze všeho nejvíc mi vadí některé defalutní hodnoty u některých polí  – seriously - kolik lidí bude používat a jak často NUMBER/VARCHAR2 a kolik výchozí domain/structured typ? Naštěstí lze nastavit (Tools -> Preference -> Data Model)

Nepodařilo se mi, ale nastavit (a zrovna featura, na kterou jsem se těšil) auto-inkrement pro primární klíče. V SQL Data Modeleru je to z nějakého důvodu šedivé (i když mám jako výchozí Oracle 12c). Takže nejprve založení sequencí pro primární klíče - dá se to ručně nebo si to vyjet nějakým šikovným selectem (po založení tabulek) :

select 'CREATE SEQUENCE '|| substr(replace(TABLE_NAME, 'TBL_','SEQ_ID_'),1,30)|| ' NOCACHE NOCYCLE KEEP GLOBAL;' from user_tables where table_name like 'TBL%'
Výsledek:
CREATE SEQUENCE SEQ_ID_BODY_LOG NOCACHE NOCYCLE KEEP GLOBAL;
CREATE SEQUENCE SEQ_ID_CIRCLE_WORKOUT_DEF_SERI NOCACHE NOCYCLE KEEP GLOBAL;
CREATE SEQUENCE SEQ_ID_CROSSFIT_TARGET_LOV NOCACHE NOCYCLE KEEP GLOBAL;
CREATE SEQUENCE SEQ_ID_CROSSFIT_WOD_LOV NOCACHE NOCYCLE KEEP GLOBAL;
CREATE SEQUENCE SEQ_ID_TABATA NOCACHE NOCYCLE KEEP GLOBAL;
CREATE SEQUENCE SEQ_ID_TABATA_LOV NOCACHE NOCYCLE KEEP GLOBAL;
CREATE SEQUENCE SEQ_ID_TABATA_SERIE NOCACHE NOCYCLE KEEP GLOBAL;
CREATE SEQUENCE SEQ_ID_WOD_CIRCLE_LIST NOCACHE NOCYCLE KEEP GLOBAL;
CREATE SEQUENCE SEQ_ID_WOD_CIRCLE_SERIE NOCACHE NOCYCLE KEEP GLOBAL;
CREATE SEQUENCE SEQ_ID_WORKOUT NOCACHE NOCYCLE KEEP GLOBAL;
CREATE SEQUENCE SEQ_ID_WORKOUT_LIST NOCACHE NOCYCLE KEEP GLOBAL;
CREATE SEQUENCE SEQ_ID_WORKOUT_LOV NOCACHE NOCYCLE KEEP GLOBAL;
CREATE SEQUENCE SEQ_ID_WORKOUT_SERIE NOCACHE NOCYCLE KEEP GLOBAL;

Možná někoho překvapí uvedení GOBAL a NOKEEP – jsou to novinky a i když jejím uvedením funkčnost nemění, je třebas se trénovat a připomínat si, že něco takového nového tam máme. O global/session jsem psal zde.  V SQL Data Modeler jsou pak sekvence nastaveny přímo v DEFAULT hodnotách pro primární klíče (DEFAULT SEQ_ID_BODY_LOG.nextval)

Obrázek modelu:

Datová vrstva - WORKOUT LOG APEX

Datová vrstva - WORKOUT LOG APEX

V modelu jsou nejsou žádné pokročilé funkce tabulek a indexů (nested, IOT apod.), ale patrně by měly být. Konkrétně tak jak je to navrhnuté by se velice hodily IOT – indexově orientované tabulky. Daleko zajímavější mi přijde udělat to takto a po té spočítat jaký to bude mít efekt (doslova vytracovat na každý čtený databázový blok) na konkrétní SQL, které pak bude aplikace používat. Podobně by se velice hodily VARRAYs/Neasted table na sety, nicméně výkon zde nemá cenu nějako honit – takže pro rychlejší práci a vývoj nyní flat heap tabulky.

Stáhnout DDL pro vytvoření tabulek lze níže. TABLESPACE není uveden, očekávám spuštění pod uživatelem, kterého vytvoří APEX. Sloupce jsem tak nějak okomentoval. Pokud někdo chce stáhnout již nyní, proč ne – nicméně ještě tam dojde nejspíše ke spoustě změnám.

Příště to vidím na založení projektu (APEX), vytvoření tabulek. Vytvoření workspaces, uživatelů a ostatní práce pro cvičené opice ;) Pokusím se to trošku více psát jako tutoriál…

 Posted by at 02:08

  One Response to “Workoutlog v APEXu – hezky od začátku #3 – návrh datové vrstvy(2)”

  1. [...] Workoutlog v APEXu – hezky od začátku #3 – návrh datové vrstvy(2) [...]

 Leave a Reply

(required)

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>