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 172014
 

První díl: Workoutlog v APEXu – hezky od začátku #1 – úvod

Takže po minulém úvodu jsem se rozhodl nastřelit nějakou datovou vrstvu – entity, tabulky, relace, constrainy apod. Asi bych tomu říkal ještě draft, postupem času to budu nějak obrábět a vylepšovat. Ale pro začátek by to mohlo stačit. Rozhodl jsem se oddělit klasické cvičení, crossfit i TABATAs i když ty tabulky jsou velice podobné – do budoucna však čekám, že se to rozjede a požadavky budou jiné. Jinak se hodlám držet normálních forem a nějakého rozumného návrhu, včetně constrainů. Některá pole asi budou vypadat duplicitní, ale je vychází to ze zkušenosti cvičení – občas člověk v sérii sundá váhu, počet cviků či se tam pokusí vsunout další cvik.

Obecněji má představa datové vrstvy: Partitions žádné (případně pouze na klíčích interval-partitioning),  žádná podpora více uživatelů (minimálně dočasně), tabulky očekávám malé – takže žádné předpočítané tabulky či materializovaná view (i když by to vypadalo sexy). Kde to má smysl, snažím se nechávat sloupec NOTE – pro poznámku.

Jmenná konvence, klasika:

  • TBL_ prefix tabulek
  • ID_ prefix pro začátek primárních klíčů, většina tabulek má jako PK integer s autoinkrementem
  • sufix _ID – cizí klíč
  • jmenná konvence constraints a ostatního je zděděna z defaulutu Oracle SQL Developer Data Modeler 4.0
  • SEQ_ prefix sekvencí

A nyní prostý seznam entit/tabulek nad kterými hodlám celou aplikaci stavět. Patrně dojde k nějakému dalšímu rozšíření během vývoje i práce s aplikací. Vše vychází ze zkušeností jaké nyní mám o cvičení a co všechno si představuji, že by mi zajímalo. Ačkoliv cvičící programátor je trošku zvláštní tvor, který to vidí trošku jinak ;)
So, flat seznam entit:

Entita #1 – TBL_WORKOUT – Záznam pro každé jednotlivé cvičení. Řekněme hlavní tabulka – entita.

  • ID_WORKOUT (NUMBER(9)) – Primární klíč generovaný se sekvence
  • WORKOUT_START (DATE) DEFAULT SYSDATE – Kdy cvičení začalo
  • WORKOUT_END (DATE) - Kdy jsme se cvičením seknuli
  • WORKOUT_DAY (VARCHAR2(200)) - Zde budu používat den v týdnu, ten by se sice dal použít z data, ale jsou lidé, co používají systém tréningů A/B, těžké/lehké apod. Takže takové volné pole pro označení typu tréningu.
  • WORKOUT_TYPE (VARCHAR2(200)) - Podobně jako předchozí pro takové věci jako cardio/posilování apod.
  • NOTE (VARCHAR2(2000)) - poznámka k tréningu

Ukázka záznamu:

ID_WORKOUT 1
WORKOUT_START 7.1.2014 14:50
WORKOUT_END 7.1.2014 15:20
WORKOUT_DAY A- těžký
WORKOUT_TYPE cardio
NOTE lehce unaven po kole

 

Entita #2 - TBL_WORKOUT_LIST – Záznam ke každému typu cvičení, které v daný workout bylo (kliky, WODy. apod)

  • ID_WORKOUT_LIST (NUMBER(9)) – Primární klíč generovaný ze sekvence
  • WORKOUT_ID (NUMBER(9)) – Cizí klíč, odkaz do tabulky TBL_WORKOUT
  • WORKOUT_LOV_ID (NUMBER(9)) – Cizí klíč, odkaz do tabulky TBL_WORKOUT_LOV
  • CREATE (DATE) – Kdy se začalo cvičit
  • DONE (DATE) - Kdy se skončilo
  • FAILED (NUMBER(1)) - V případě, že naplánované cvičení uživatel nezvládne..
  • NOTE(VARCHAR2(2000)) – vlastní poznámka

Ukázka záznamu:

ID_WORKOUT_LIST 1
WORKOUT_ID 1
WORKOUT_LOV_ID 1
CREATE 7.1.2014 14:51
DONE 7.1.2014 14:54
FAILED 0
NOTE příště zvednout váhu

 

Entita #3 – TBL_WORKOUT_LOV – Tabulka LOV (list of values) pro jednotlivá cvičení – představuji si tam něco jako bicepsové zdvihy, floor press, kliky..

  • ID_WORKOUT_LOV (NUMBER(9)) - Primární klíč generovaný se sekvence (autoinkrement)
  • WORKOUT_DESCRIPTION (VARCHAR2(200)) – Název cvičení/popis – bicepsové zdvihy, floor press
  • WEIGHT (NUMBER(6,2)) – Váha čínek/těla, zátěže..
  • BODY_WEIGHT_RELATIVE (NUMBER(1)) – 0-není relevantní, 1-váha těla, 2-váha těla+weight
  • TARGET (NUMBER(3)) – Cíl – počet opakování apod.
  • TIME_REST (NUMBER(4)) – Očekávaná přestávka v sekundách
  • NOTE(VARCHAR2(2000)) - Poznámka..

Ukázka záznamu:

ID_WORKOUT_LOV 1
WORKOUT_DESCRIPTION bicepsové zdvihy
WEIGHT 14,4
BODY_WEIGHT_RELATIVE 0
TARGET 10
TIME_REST 10
NOTE -

 

Entita #4 – TBL_WORKOUT_SERIE – tabulka s vlastním logem cvičení – záznam pro každou serii.

  • ID_WORKOUT_SERIE(NUMBER(9)) - Primární klíč generovaný se sekvence
  • WORKOUT_LIST_ID(NUMBER(9)) - Odkaz do TBL_WORKOUT_LIST
  • LOV_WORKOUT_ID(NUMBER(9)) – Odkaz do TBL_WORKOUT_LOV s typem cvičení
  • ID_WORKOUT_ORDER(NUMBER(3)) – Pořadí serie
  • WEIGHT(NUMEBER((6,2)) – Váha čínek..
  • TARGET(NUMBER((3)) – Cíl počtu opakování
  • REPEATS(NUMBER(3)) – Počet skutečných opakování v serii
  • TIME_REST(NUMBER(4)) – Počet sekund odpočinku
  • NOTE(VARCHAR2(2000)) - Poznámka..

Zkázka záznamu:

ID_WORKOUT_SERIE 1
WORKOUT_LIST_ID 1
LOW_WORKOUT_ID 1
ID_WORKOUT_ORDER 4
WEIGHT 12,2
TARGET 10
REPEATS 8
TIME_REST 10
NOTE Na pslední serii jsem vyhodi 2kg

Kritika: Pozorný programátor si určitě všimne, že tu není něco úplně v pořádku – udržování váhy/odpočinku/počtu na úrovni LOV (samo o sobě by mohlo vyžadovat další tabulku) i na úrovni zápisu jedné serie? Moje představa je taková, že na úrovni LOV to bude mít význam jako “výchozí/převyplněné” zatímco do logu půjde skutečná hodnota a tedy nebude problém uprostřed serie sundat váhu či počet opakování. Takhle by to být nemělo, ale ušetří to spoustu práce ;)

Entita #5 – TBL_TABATA_LIST – Master záznam pro TABATY, podobná analogie TBL_WORKOUT_LIST. Pro každou TABATA jeden záznam.

  • ID_TABATA (NUMBER(9)) - Primární klíč generovaný ze sekvence..
  • WORKOUT_ID (NUMBER(9)) – Cizí klíč do tabulky TBL_WORKOUT
  • TABATA_LOV_ID (NUMBER(9)) - Cizí klíč, odkaz do tabulky TBL_TABATA_LOV
  • WORK_TIME_SECOND (NUMBER(3)) DEFAULT 20 - Počet sekund práce
  • REST_TIME_SECOND (NUMBER(2)) DEFAULT 10 – Počet sekund odpočinku
  • LEVELS (NUMBER(3)) DEFAULT 8 – Počet serii
  • STARED (DEATE) DEFAULT SYSDATE – Kdy jsem začali (konec TABAT je přesně definovaný, tedy jen start) Oficiální TABATA má 4minuty přesně.
  • SCORE(NUMBER(12,6)) – TABATA score – dost lidí používá jedno číslo k určení výkonu v TABATA tréningu. Typicky nejnižší serie. Což je přístup, který se mi moc nelíbí, osobně dvě serie za sebou (18,12) považuji za lepší než (15,15). Sledování nejnižší série svádí k tomu, šetřit si síly, což by v TABATA tréningu být nemělo. Takže na score použiji nějaký sofistikovanější výpočet.
  • SCORE_ALGORITHM (VARCHAR2(200)) – Viz předchozí sloupec, nejspíše se takový algoritmus bude ladit, tak ať je někde uloženo, jak se to počítalo. Po vyladění – oba sloupce patrně na drop.
  • NOTE (VARCHAR2(2000)) – Poznámka..

Ukázka záznamu:

ID_TABATA 1
WORKOUT_ID 1
TABATA_LOV_ID 1
WORK_TIME_SECOND 20
REST_TIME_SECOND 10
LEVELS 8
STARTED 14.1.20014 15:15:00
SCORE 54
SCORE_ALGORITHM Nejnižší v serii
NOTE nezvracel jsem !!

Je zde vidět rozdíl mezi klasickým cvičením a TABATA, časy jsem se rozhodl držet na úrovni master záznamu – při HIIT – vysoce taktovaném tréningu není čas ani ambice měnit pauzy ani prostor měnit váhu čínek. Často ani počítat počty cviků. O proti klasickému cvičení chybí pole FAILED – Tabaty se prostě dokončují i když se zvrací ;)

Entita #6 – TBL_TABATA_LOV – Tabulka LOV (list of values) pro jednotlivá TABATA cvičení

  • ID_TABATA_LOV(NUMBER(9)) – Primární klíč generovaný ze sekvence
  • NAME(VARCHAR2(200)) – Jméno TABATA cvičení
  • ATTRIBUTE_1V(VARCHAR2(200)) – Upřesnění/Free text
  • NOTE(VARCHAR2(2000)) - Poznámka..
ID_TABATA_LOV 1
NAME kliky
ATTRIBUTE_1V když nezvládám, prokládám squatem
NOTE na burn kaloriíí

 

Entita #7 – TBL_TABATA_SERIES - jeden záznam, jedna serie v TABATA/HIIT cvičení, analogie TBL_WORKOUT_SERIES

  • ID_TABATA_SERIES(NUMBER(9)) - Primární klíč generovaný ze sekvence
  • TABATA_LIST_ID(NUMBER(9)) – Odkaz do tabulky TBL_TABATA_LIST
  • TABATA_LOV_ID(NUMBER(9)) - Odkaz do tabulky TBL_TABATA_LOV
  • ID_TABATA_ORDER(NUMBER(3)) – Pořadí serií..
  • COUNT(NUMBER(5)) - Počet cviků, pokud je počítáno
  • NOTE(VARCHAR2(2000)) – Poznámka..

Ukázka záznamu:

ID_TABATA_SERIES 1
TABATA_LIST_ID 1
TABATA_LOV_ID 1
ID_TABATA_ORDER 8
COUNT 15
NOTE prvně jsem vydržel nezvracet až do téhle poslední serie ;)

 

Entita #8 – TBL_CROSSFIT_WOD_LOV – Master tabulka s WOD (Workout of Day), z velké části databázové kopie těchto: http://www.crossfitcvi.com/resources/benchmark-hero-wods

  • ID_CROSSFIT_WOD_LOV(NUMBER(9)) - Primární klíč generovaný ze sekvence
  • NAME(VARCHAR2(200)) - Jméno WOD (Cindy, Chelsia..)
  • IS_DEFAULT(NUMBER(1)) – Standardní nebo vlastní
  • CROSSFIT_TARGET_LOV_ID(NUMBER(9)) – Odkaz to tabulky TBL_CROSSFIT_TARGET_LOV
  • PICTURE (BLOB) – Obrázek, ať je to hezké
  • ROUNDS(NUMBER(5)) – Počet kol
  • NOTE(VARCHAR2(2000)) – Poznámka..

Ukázka záznamu:

ID_CROSSFIT_WOD_LOV 1
NAME Cindy
IS_DEFAULT 1
CROSSFIT_TARGET_LOV_ID 1
PICTURE [data]
ROUNDS 5
NOTE velice jednoduché

 

Entita #9 – TBL_CROSSFIT_TARGET_LOV – Krátký list of values pro typy cílů, bude tam pár záznamů

  • ID_CROSSFIT_TARGET_LOV(NUMBER(9)) – Primární klíč generovaný ze sekvence
  • TARGET_NAME(VARCHAR2((200)) - Název cíle
  • NOTE(VARCHAR2(2000)) – Vysvětlení/Poznámka

Ukázka záznamu:

ID_CROSSFIT_TARGET_LOV 1
TARGET_NAME AMRAP
NOTE As Many Rounds As Possible
CROSSFIT_TARGET_LOV_ID 1
PICTURE [date]
ROUNDS 0
NOTE velice jednoduché

 

Entita #10 – TBL_CIRCLE_WORKOUT_DEF_SERIE – Tabulka s definovanými cviky pro kruhová cvičení a případně WODy.

  • ID_CIRCLE_WORKOUT_DEF_SERIE(NUMBER(9)) – Primární klíč generovaný ze sekvence
  • ID_CIRCLE_ORDER(NUMBER(2)) – Pořadí v kruhovém tréningu
  • CROSSFIT_LOV_WOD_ID(NUMBER((9)) – Odkaz do TBL_CROSSFIT_LOW_WOD
  • WORKOUT_OR_TABATA_LOV_ID(NUMBER(9)) - Odkaz na konkrétní cvik či TABATA
  • IS_TABATA_OR_WORKOUT_ID(NUMBER(1)) – Do které tabulky je odkaz 0-workout, 1-TABATA
  • ATTRIBUTE_1v (VARCHAR2(200)) – Případné další rozšíření - varchar2
  • ATTRIBUTE_1n(NUMBER) – Případné další rozšíření – number
  • NOTE(VARCHAR2(2000)) – Volné pro poznámky

Ukázka záznamu:

ID_CIRCLE_WORKOUT_DER_SERIE 1
ID_CIRCLE_ORDER 1
CROSSFIT_LOV_WOD_ID 1
WORKOUT_OR_TABATA_LOV_ID 2
IS_TABATA_OR_WORKOUT_ID 1
ATTRIBUTE_1v -
ATTRIBUTE_1n -
NOTE velice jednoduché

 

Entita #11 – TBL_BODY – Entita, která stojí trošku vedle – sledování těla (váha, objemy apod.)

  • ID_BODY_LOG(NUMBER(9)) - Primární klíč generovaný ze sekvence
  • LOG_DATE (DATE) – Kdy byl záznam vložen
  • BODY_WEIGHT (NUMBER(4,1)) - Váha cvičence
  • BODY_FAT (NUMBER(4,2)) – Procento tuku v těle
  • ABDOMEN (NUMBER(5,1)) – Obvod pasu
  • BICEPS(NUMBER(5,1)) – Obvod bicepsu
  • BREAST(NUMBER(5,1)) - Obvod prsou
  • CALF(NUMBER(5,1)) – Obvod lýtek
  • THIGH(NUMBER(5,1)) – Obvod stehna

Ukázka záznamu:

ID_BODY_LOG 1
LOG_DATE 12.5.2014
BODY_WEIGHT 78
BODY_FAT 15
ABDOMEN 83
BICEPS 38
BREAST 105
CALF 37
CALF 37

 

Uf, tak to by byl nějaký můj draft či nastřelení mých představ. Mám vše uloženo V SQL Data Modeler a v příštím díle sem chodím nějaké to schéma s nakreslenými relacemi. A nejspíš i nějakou komplexnější kritikou modelu, protože best-practice návrh je jedna věc, rychlost vývoje aplikace, kterou chcete člověk sám používat je věc druhá ;)

Příště: Schéma + referenční integrity a kritika navrhnuté datové vrstvy. A nejspíše i DDLs.

 Posted by at 00:00

  4 Responses to “Workoutlog v APEXu – hezky od začátku #2 – návrh datové vrstvy(1)”

  1. Super, díky. Zrovna se mi podobný tutorial bude hodit, chtěl bych začít s PL/SQL jako junior programátor. Už jsem tedy něco dělal s APEXem ve škole. A docela mě to mile překvapilo.

  2. Diky za komentář,!

    Budu se snažit ;) Ačkoliv z toho PL/SQL toho tam nejspíše nebude moc třeba – vidím to jen na pár funkcí.

    Tak případně můžeš vykritizovat APEX, jeden z důvodů proč jsem se rozhodl do toho jít – udělat v APEXu alespoň trošku něco většího. Takovéto zkoušení si za sebou už mám, ale stále je to ve stádiu učení se. Času asi dost, firmy jedou pořád na Formsech ;) :-/ :D

  3. [...] 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) [...]

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

 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>