Changes between Version 5 and Version 6 of AdvancedConcepts


Ignore:
Timestamp:
06/11/26 09:21:40 (5 days ago)
Author:
231014
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • AdvancedConcepts

    v5 v6  
    11== Advanced Concepts ==
    22
    3 Напредната тема имплементира напреден аналитички (OLAP) слој врз трансакциски податоци за инвентар, користејќи TimescaleDB и pg_cron. Главната идеја е да се овозможи брза анализа на големи количини на податоци преку податочни cubes, наместо директно читање од сурови трансакции. Со ова се подобрува перформансата на извештаи, се намалува комплексноста на SQL кверињата и се овозможува скалабилна аналитика во реално време.
    4 
    5 {{{ Креирање на hypertables }}}
    6 Во првиот дел се трансформираат класичните табли во TimescaleDB hypertables. Табелите inventory_transactions и inventory_movements се партиционираат по created_at во месечни chunk-ови. Ова овозможува значително побрзо читање и скалирање на временски базирани податоци.
    7 
    8 {{{ cube_movements_daily }}}
    9 Овој дел креира материјализиран view кој агрегира движења по ден, производ, бренд и магацин. Податоците се поделени на outbound и inbound логика за да се следи протокот на роба од и кон магацини. Резултатот е дневен аналитички слој кој значително ја намалува потребата од сложени join операции во реално време.
    10 
    11 {{{ cube_movements_monthly }}}
    12 Овој куб ги агрегира дневните податоци во месечни резимеа. Наместо директно да работи со сурови податоци, системот сега користи веќе пресметани дневни вредности. Ова овозможува побрзи извештаи на месечно ниво и подобра скалабилност.
    13 
    14 {{{ cube_movements_monthly }}}
    15 Овој материјализиран view ги поврзува варијантите на производи со нивните атрибути (како боја, големина итн.). Се чуваат и агрегирани информации за број на атрибути по производ. Ова овозможува брзо филтрирање и сегментација во аналитички извештаи.
    16 
    17 {{{ Автоматско освежување }}}
    18 Во овој дел се дефинираат continuous aggregate политики за автоматско ажурирање на дневниот и месечниот куб. Системот периодично ги пресметува новите податоци без рачна интервенција. Ова обезбедува податоците секогаш да бидат релативно свежи и конзистентни.
    19 
    20 {{{ Cron Job }}}
    21 Со pg_cron се закажува дневно освежување на cube_product_attributes. Ова осигурува дека атрибутите на производите се синхронизирани со најновите промени. Се користи за задачи кои не бараат континуирано ажурирање, туку периодично.
    22 
    23 {{{ Извештаи }}}
    24 -Топ 25% производи по продажба
    25 
    26 Овој извештај ги рангира производите според вкупно поместена количина во даден магацин и период. Се користи NTILE за да се најдат најдобрите 25% од производите. Ова помага во анализа на најуспешни производи.
    27 
    28 -Најслаби 25% магацини по turnover
    29 
    30 Овој извештај ја пресметува ефикасноста на магацините според односот помеѓу движење и залиха. Магацините се рангираат во квартили за да се идентификуваат најслабите перформанси. Ова помага за оптимизација на логистиката.
    31 
    32 -Топ црвени производи
    33 
    34 Овој дел филтрира производи со атрибут „црвена боја“ и ги рангира според продажба. Се комбинираат атрибути и агрегирани податоци од кубот.
    35 
    36 
    37 Ова решение овозможува брза и ефикасна анализа на големи количини податоци преку OLAP кубови наместо директни квериња од сурови трансакции. Со тоа се добиваат значително побрзи извештаи, помало оптоварување на базата и пониски инфраструктурни трошоци. Бизнисот добива подобар увид во продажба, залихи и перформанси на магацините, што овозможува брзо носење одлуки. Дополнително, автоматското освежување на податоците обезбедува секогаш актуелни и сигурни аналитики без рачна интервенција.
    38 
    39 
    40 
    41 
    42 
     3# Документација за имплементација на Time-Series и OLAP
     4
     5## Цел на скриптата
     6
     7Целта на оваа скрипта е да ја подобри аналитичката ефикасност и скалабилност на системот за управување со магацин преку имплементација на **TimescaleDB** и **OLAP (Online Analytical Processing)** архитектура.
     8
     9Системот содржи голем број трансакции и движења на залихи кои континуирано се генерираат со текот на времето. Поради тоа, класичните PostgreSQL табели стануваат неефикасни за аналитички прашања кои опфаќаат големи временски периоди.
     10
     11Со оваа имплементација се постигнува:
     12
     13* Подобри перформанси при аналитички пребарувања.
     14* Оптимизирано складирање на временски податоци.
     15* Автоматско партиционирање на податоците според време.
     16* Брзо генерирање на извештаи преку претходно агрегирани податоци.
     17* Намалување на оптоварувањето врз оперативната база.
     18
     19---
     20
     21# 1. Иницијализација на TimescaleDB
     22
     23```sql
     24CREATE EXTENSION IF NOT EXISTS timescaledb;
     25```
     26
     27Во првиот чекор се активира TimescaleDB екстензијата.
     28
     29TimescaleDB претставува надградба на PostgreSQL специјализирана за работа со временски серии (time-series data). Бидејќи сите движења и трансакции во системот содржат временска ознака (`created_at`), овие податоци природно се вклопуваат во time-series модел.
     30
     31---
     32
     33# 2. Подготовка на табелите
     34
     35## Отстранување на постоечки ограничувања
     36
     37Пред конверзијата се отстрануваат:
     38
     39* примарни клучеви;
     40* надворешни клучеви кои зависат од табелите што ќе се мигрираат.
     41
     42Причината е што TimescaleDB бара временската колона да биде дел од примарниот клуч на hypertable.
     43
     44---
     45
     46# 3. Редефинирање на примарните клучеви
     47
     48Се воведуваат композитни примарни клучеви:
     49
     50```sql
     51ALTER TABLE inventory_movements
     52ADD PRIMARY KEY (created_at, id);
     53```
     54
     55и
     56
     57```sql
     58ALTER TABLE inventory_transactions
     59ADD PRIMARY KEY (created_at, id);
     60```
     61
     62## Зошто е имплементирано?
     63
     64TimescaleDB бара partition колоната (`created_at`) да биде дел од примарниот клуч.
     65
     66Ова овозможува:
     67
     68* правилна распределба на податоците во chunk-ови;
     69* побрзо пребарување по временски интервали;
     70* одржување на уникатност на записите.
     71
     72---
     73
     74# 4. Миграција кон Hypertables
     75
     76## Креирање Hypertables
     77
     78```sql
     79SELECT create_hypertable(
     80    'inventory_transactions',
     81    'created_at',
     82    chunk_time_interval => INTERVAL '1 month',
     83    migrate_data => FALSE
     84);
     85```
     86
     87### Зошто е имплементирано?
     88
     89Hypertable претставува логичка табела која физички е поделена на повеќе помали партиции (chunks).
     90
     91Во овој случај:
     92
     93* секој chunk содржи податоци за еден месец;
     94* пребарувањата врз одреден временски период ги читаат само релевантните chunks;
     95* значително се намалува количината на податоци која PostgreSQL треба да ја скенира.
     96
     97---
     98
     99# 5. OLAP Слој
     100
     101По оптимизацијата на складирањето се имплементира аналитички слој.
     102
     103Основната идеја е оперативните податоци да не се пресметуваат повторно при секој извештај.
     104
     105Наместо тоа се користат **Continuous Aggregates**.
     106
     107---
     108
     109# 6. Daily Cube – cube_movements_daily
     110
     111Се креира материјализиран поглед:
     112
     113```sql
     114CREATE MATERIALIZED VIEW cube_movements_daily
     115WITH (timescaledb.continuous)
     116```
     117
     118Овој агрегат ги групира податоците по:
     119
     120* производ;
     121* бренд;
     122* магацин;
     123* ден.
     124
     125---
     126
     127## Метрики
     128
     129### total_moved
     130
     131Пресметува нето движење на залихите.
     132
     133Излезни движења:
     134
     135```sql
     136WHEN mv.from_bin_id IS NOT NULL
     137THEN -mv.quantity
     138```
     139
     140Влезни движења:
     141
     142```sql
     143WHEN mv.to_bin_id IS NOT NULL
     144THEN mv.quantity
     145```
     146
     147Ова овозможува следење на реалниот проток на роба низ магацините.
     148
     149---
     150
     151### movement_count
     152
     153```sql
     154COUNT(*)
     155```
     156
     157Го претставува бројот на движења.
     158
     159---
     160
     161### transaction_count
     162
     163```sql
     164COUNT(DISTINCT mv.inventory_transactions_id)
     165```
     166
     167Го претставува бројот на уникатни трансакции.
     168
     169---
     170
     171# 7. Monthly Cube – cube_movements_monthly
     172
     173Над дневниот агрегат се гради месечен агрегат:
     174
     175```sql
     176CREATE MATERIALIZED VIEW cube_movements_monthly
     177```
     178
     179Овој пристап е познат како:
     180
     181**Aggregation-on-Aggregation**
     182
     183Наместо секој пат да се читаат милиони записи од `inventory_movements`, системот чита веќе агрегирани дневни резултати.
     184
     185Со тоа се добива:
     186
     187* помал број прочитани записи;
     188* побрзо извршување на извештаи;
     189* подобра скалабилност.
     190
     191---
     192
     193# 8. Автоматско освежување
     194
     195Се конфигурира политика:
     196
     197```sql
     198SELECT add_continuous_aggregate_policy(...)
     199```
     200
     201Политиката автоматски ги освежува агрегатите секој час.
     202
     203## Причина
     204
     205На овој начин:
     206
     207* аналитичките податоци остануваат речиси во реално време;
     208* нема потреба од рачно освежување;
     209* извештаите секогаш користат ажурирани податоци.
     210
     211Дополнително се извршува:
     212
     213```sql
     214CALL refresh_continuous_aggregate(...)
     215```
     216
     217за иницијално пополнување на агрегатите.
     218
     219---
     220
     221# 9. Аналитички извештаи
     222
     223## Извештај 1: Топ 25% производи
     224
     225Целта е да се идентификуваат најактивните производи според количината на движење.
     226
     227Се користат:
     228
     229* месечниот cube;
     230* агрегирање по производ;
     231* квартилна анализа преку `NTILE(4)`.
     232
     233Производите во првиот квартил претставуваат најдвижени производи во избраниот период.
     234
     235Овој извештај е корисен за:
     236
     237* оптимизација на залихи;
     238* планирање на набавки.
     239
     240---
     241
     242## Извештај 2: Bottom 25% Warehouses by Inventory Turnover
     243
     244Целта е да се идентификуваат магацини со најнизок коефициент на обртот на залихите.
     245
     246Коефициентот се пресметува како:
     247
     248```text
     249Turnover Ratio =
     250Вкупно движење / Вкупна количина на залиха
     251```
     252
     253Потоа магацините се распределуваат во квартили.
     254
     255Првиот квартил ги претставува магацините со најслаби перформанси.
     256
     257Овој извештај може да помогне при:
     258
     259* откривање неефикасни магацини;
     260* оптимизација на складишниот простор;
     261* подобрување на логистичките процеси.
     262
     263---
     264
     265# Заклучок
     266
     267Со оваа имплементација оперативните табели за движење и трансакции се трансформираат во TimescaleDB hypertables, што овозможува значително подобри перформанси при работа со големи количини временски податоци.
     268
     269Дополнително, преку имплементација на Continuous Aggregates се создава OLAP слој кој обезбедува брзо генерирање на аналитички извештаи без потреба од повторно процесирање на суровите податоци.
     270
     271Резултатот е архитектура која истовремено поддржува оперативни трансакции (OLTP) и аналитичко известување (OLAP), со висока скалабилност, подобри перформанси и поефикасно користење на ресурсите на базата на податоци.