Changes between Version 8 and Version 9 of AdvancedConcepts


Ignore:
Timestamp:
06/11/26 09:58:37 (5 days ago)
Author:
231170
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedConcepts

    v8 v9  
    1 == Advanced Concepts ==
    2 
    3 = Документација за имплементација на Time-Series и OLAP =
     1= Advanced Concepts =
     2
     3== Документација за имплементација на Time-Series и OLAP ==
    44
    55{{{ Цел на скриптата}}}
     
    1717* Намалување на оптоварувањето врз оперативната база.
    1818
    19 ---
    20 
    21 {{{ 1. Иницијализација на TimescaleDB }}}
    22 
    23 ```sql
    24 CREATE EXTENSION IF NOT EXISTS timescaledb;
    25 ```
     19
     20== 1. Иницијализација на TimescaleDB ==
     21
     22{{{CREATE EXTENSION IF NOT EXISTS timescaledb;}}}
    2623
    2724Во првиот чекор се активира TimescaleDB екстензијата.
     
    2926TimescaleDB претставува надградба на PostgreSQL специјализирана за работа со временски серии (time-series data). Бидејќи сите движења и трансакции во системот содржат временска ознака (`created_at`), овие податоци природно се вклопуваат во time-series модел.
    3027
    31 ---
    32 
    33 {{{ 2. Подготовка на табелите }}}
    34 
    35  Отстранување на постоечки ограничувања
     28
     29
     30== 2. Подготовка на табелите ==
     31
     32{{{Отстранување на постоечки ограничувања}}}
    3633
    3734Пред конверзијата се отстрануваат:
     
    4239Причината е што TimescaleDB бара временската колона да биде дел од примарниот клуч на hypertable.
    4340
    44 ---
    45 
    46 {{{ 3. Редефинирање на примарните клучеви}}}
    47 
    48 Се воведуваат композитни примарни клучеви:
    49 
    50 ```sql
     41
     42
     43== 3. Редефинирање на примарните клучеви ==
     44
     45=== Се воведуваат композитни примарни клучеви: ===
     46
     47{{{
    5148ALTER TABLE inventory_movements
    5249ADD PRIMARY KEY (created_at, id);
    53 ```
     50}}}
    5451
    5552и
    5653
    57 ```sql
     54{{{
    5855ALTER TABLE inventory_transactions
    5956ADD PRIMARY KEY (created_at, id);
    60 ```
    61 
    62  Зошто е имплементирано?
     57}}}
     58
     59 === Зошто е имплементирано? ===
    6360
    6461TimescaleDB бара partition колоната (`created_at`) да биде дел од примарниот клуч.
     
    7067* одржување на уникатност на записите.
    7168
    72 ---
    73 
    74 {{{ 4. Миграција кон Hypertables }}}
    75 
    76  Креирање Hypertables
    77 
    78 ```sql
     69
     70
     71== 4. Миграција кон Hypertables ==
     72
     73 === Креирање Hypertables ===
     74
     75{{{
    7976SELECT create_hypertable(
    8077    'inventory_transactions',
    8178    'created_at',
    8279    chunk_time_interval => INTERVAL '1 month',
    83     migrate_data => FALSE
     80    migrate_data => TRUE
    8481);
    85 ```
    86 
    87  Зошто е имплементирано?
     82}}}
     83
     84 === Зошто е имплементирано? ===
    8885
    8986Hypertable претставува логичка табела која физички е поделена на повеќе помали партиции (chunks).
     
    9592* значително се намалува количината на податоци која PostgreSQL треба да ја скенира.
    9693
    97 ---
    98 
    99 {{{ 5. OLAP Слој }}}
     94
     95
     96== 5. OLAP Слој ==
    10097
    10198По оптимизацијата на складирањето се имплементира аналитички слој.
     
    105102Наместо тоа се користат **Continuous Aggregates**.
    106103
    107 ---
    108 
    109 {{{ 6. Daily Cube – cube_movements_daily }}}
    110 
    111 Се креира материјализиран поглед:
    112 
    113 ```sql
     104
     105== 6. Daily Cube – cube_movements_daily ==
     106
     107=== Се креира материјализиран поглед: ===
     108
     109{{{
    114110CREATE MATERIALIZED VIEW cube_movements_daily
    115111WITH (timescaledb.continuous)
    116 ```
     112}}}
    117113
    118114Овој агрегат ги групира податоците по:
     
    123119* ден.
    124120
    125 ---
    126 
    127  Метрики
    128 
    129 ## total_moved
     121
     122
     123 === Метрики ===
     124
     125==== total_moved ====
    130126
    131127Пресметува нето движење на залихите.
    132128
    133 Излезни движења:
    134 
    135 ```sql
     129**Излезни движења:**
     130
     131{{{
    136132WHEN mv.from_bin_id IS NOT NULL
    137133THEN -mv.quantity
    138 ```
    139 
    140 Влезни движења:
    141 
    142 ```sql
     134}}}
     135
     136**Влезни движења:**
     137
     138{{{
    143139WHEN mv.to_bin_id IS NOT NULL
    144140THEN mv.quantity
    145 ```
     141}}}
    146142
    147143Ова овозможува следење на реалниот проток на роба низ магацините.
    148144
    149 ---
    150 
    151 ## movement_count
    152 
    153 ```sql
     145
     146
     147==== movement_count ====
     148
     149{{{
    154150COUNT(*)
    155 ```
     151}}}
    156152
    157153Го претставува бројот на движења.
    158154
    159 ---
    160 
    161 ## transaction_count
    162 
    163 ```sql
     155
     156==== transaction_count ====
     157
     158{{{
    164159COUNT(DISTINCT mv.inventory_transactions_id)
    165 ```
     160}}}
    166161
    167162Го претставува бројот на уникатни трансакции.
    168163
    169 ---
    170 
    171 {{{ 7. Monthly Cube – cube_movements_monthly }}}
     164
     165
     166== 7. Monthly Cube – cube_movements_monthly ==
    172167
    173168Над дневниот агрегат се гради месечен агрегат:
    174169
    175 ```sql
     170{{{
    176171CREATE MATERIALIZED VIEW cube_movements_monthly
    177 ```
     172}}}
    178173
    179174Овој пристап е познат како:
     
    189184* подобра скалабилност.
    190185
    191 ---
    192 
    193 {{{ 8. Автоматско освежување}}}
     186
     187 == 8. Автоматско освежување ==
    194188
    195189Се конфигурира политика:
    196190
    197 ```sql
     191{{{
    198192SELECT add_continuous_aggregate_policy(...)
    199 ```
     193}}}
    200194
    201195Политиката автоматски ги освежува агрегатите секој час.
     
    211205Дополнително се извршува:
    212206
    213 ```sql
     207{{{
    214208CALL refresh_continuous_aggregate(...)
    215 ```
     209}}}
    216210
    217211за иницијално пополнување на агрегатите.
    218212
    219 ---
    220 
    221 {{{ 9. Аналитички извештаи }}}
    222 
    223 # Извештај 1: Топ 25% производи
     213
     214 == 9. Аналитички извештаи ==
     215
     216=== Извештај 1: Топ 25% производи ===
    224217
    225218Целта е да се идентификуваат најактивните производи според количината на движење.
     
    238231* планирање на набавки.
    239232
    240 ---
    241 
    242 # Извештај 2: Bottom 25% Warehouses by Inventory Turnover
     233
     234=== Извештај 2: Bottom 25% Warehouses by Inventory Turnover ===
    243235
    244236Целта е да се идентификуваат магацини со најнизок коефициент на обртот на залихите.
     
    246238Коефициентот се пресметува како:
    247239
    248 ```text
     240{{{
    249241Turnover Ratio =
    250242Вкупно движење / Вкупна количина на залиха
    251 ```
     243}}}
    252244
    253245Потоа магацините се распределуваат во квартили.
     
    261253* подобрување на логистичките процеси.
    262254
    263 ---
    264 
    265 {{{ Заклучок }}}
     255
     256== Заклучок ==
    266257
    267258Со оваа имплементација оперативните табели за движење и трансакции се трансформираат во TimescaleDB hypertables, што овозможува значително подобри перформанси при работа со големи количини временски податоци.