Analüüsides veebisaidi statistikat, saame ülevaate sellest, mis sellel toimub. Tulemusi seostatakse teiste teadmistega tootest või teenusest, et parandada meie kogemust.
Kui esialgsete tulemuste analüüs on lõpetatud ja informatsiooni on mõistetud ning järeldused on tehtud, algab järgmine etapp. Tulevad ideed: kuidas kui vaadata andmeid teisest küljest?
Selles etapis on analüüsitööriistade piirangud. See on üks põhjus, miks mulle ei piisanud Google Analyticsi tööriistast, nimelt selle piiratud võimetest näha oma andmeid ja neid manipuleerida.
Alati on olnud soov kiiresti laadida baandmeid (meistrandmeid), lisada teine aggregatsiooni tasand või tõlgendada olemasolevaid väärtusi.
Seda on lihtne teha access.log faili põhjal ja selleks piisab SQL keelest.
Nii et, millistele küsimustele ma vastust leida tahtsin?
Mis ja millal veebisaidil muutus
Baandate (meistrandmete) muudatuste ajalugu on alati huvitav.

SQL aruande päring.
VALI
1 kui 'Külgkokkudend bar: Sisu uuendused kuude lõikes',
strftime('%m/%Y', datetime(UPDATE_DT, 'unixepoch')) AS 'Kuu',
COUNT(CASE WHEN PAGE_TITLE != 'n.a.' THEN DIM_REQUEST_ID END) AS 'Veebilehe uuendused',
COUNT(CASE WHEN PAGE_DESCR = 'IMAGES' THEN DIM_REQUEST_ID END) AS 'Pildi üleslaadimised',
COUNT(CASE WHEN PAGE_DESCR = 'VIDEO' THEN DIM_REQUEST_ID END) AS 'Video üleslaadimised',
COUNT(CASE WHEN PAGE_DESCR = 'AUDIO' THEN DIM_REQUEST_ID END) AS 'Heli üleslaadimised'
FROM DIM_REQUEST
WHERE PAGE_TITLE != 'n.a.' OR PAGE_DESCR != 'n.a.'
GROUP BY strftime('%m/%Y', datetime(UPDATE_DT, 'unixepoch'))
ORDER BY UPDATE_DTNäiteks, mingil hetkel tehti saidi jaoks otsingumootori optimeerimine või lisati uusi sisu, mistõttu oodatakse liikluse suurenemist.
Kasutajagruppide
Kasutajagruppi kõige lihtsamaks näiteks võib olla kasutaja agent või operatsioonisüsteemi nimi.
Kasutaja agentide mõõtmine on mõningal määral kokku kogunud ligikaudu tuhat salvestust ja mind huvitab näha agentide jaotumise dünaamikat grupi piires.

SQL aruande päring.
VALI
1 kui 'Külgkokkudend bar: Kasutaja Agendid',
AGENT_OS AS 'OS',
SUM(CASE WHEN AGENT_BOT = 'n.a.' THEN 1 ELSE 0 END) AS 'Kasutaja agentide kasutajad',
SUM(CASE WHEN AGENT_BOT != 'n.a.' THEN 1 ELSE 0 END) AS 'Kasutaja agentide robotid'
FROM DIM_USER_AGENT
WHERE DIM_USER_AGENT_ID != -1
GROUP BY AGENT_OS
ORDER BY 3 DESCEnamasti tuleb erinevaid agentide kombinatsioone saidile Windowsi maailmast. Määramata jäävad sellised, nagu WhatsApp, PocketImageCache, PlayStation, SmartTV jne.
Kasutajagruppide aktiivsus nädalate kaupa
Mõningate gruppide ühendamisel on võimalik jälgida nende aktiivsuse jaotust.
Näiteks tarbivad Linuxi klastri kasutajad veebisaidil rohkem liiklust kui kõik teised.

SQL aruande päring.
SELECT
1 as 'StackedBar: Liiklusmaht kasutaja OS ja nädala järgi',
strftime('%W nädal', datetime(FCT.EVENT_DT, 'unixepoch')) AS 'Nädal',
SUM(CASE WHEN USG.AGENT_OS IN ('Android', 'Linux') THEN FCT.BYTES ELSE 0 END)/1000 AS 'Android/Linux Kasutajad',
SUM(CASE WHEN USG.AGENT_OS IN ('Windows') THEN FCT.BYTES ELSE 0 END)/1000 AS 'Windows Kasutajad',
SUM(CASE WHEN USG.AGENT_OS IN ('Macintosh', 'iOS') THEN FCT.BYTES ELSE 0 END)/1000 AS 'Mac/iOS Kasutajad',
SUM(CASE WHEN USG.AGENT_OS IN ('n.a.', 'BlackBerry') THEN FCT.BYTES ELSE 0 END)/1000 AS 'Muu'
FROM
FCT_ACCESS_USER_AGENT_DD FCT,
DIM_USER_AGENT USG,
DIM_HTTP_STATUS HST
WHERE FCT.DIM_USER_AGENT_ID=USG.DIM_USER_AGENT_ID
AND FCT.DIM_HTTP_STATUS_ID = HST.DIM_HTTP_STATUS_ID
AND USG.AGENT_BOT = 'n.a.' /* ainult kasutajad */
AND HST.STATUS_GROUP IN ('Successful') /* head lehed */
AND datetime(FCT.EVENT_DT, 'unixepoch') > date('now', '-3 month')
GROUP BY strftime('%W nädal', datetime(FCT.EVENT_DT, 'unixepoch'))
ORDER BY FCT.EVENT_DTIntensiivne liiklustarbimine
Tabelist on näha kõige aktiivsemaid kasutajagruppe ja nende aktiivsuse päeva.
Kõige aktiivsemad kuuluvad Linuxi klastrisse.

SQL aruande päring.
VALI
1 NAGU 'Tabel: Kasutaja Agent, kellel on Suur Kasutus',
strftime('%d.%m.%Y', datetime(FCT.EVENT_DT, 'unixepoch')) NAGU 'Päev',
ROUND(1.0*SUM(FCT.BYTES)/1000000, 1) NAGU 'Liiklus MB',
ROUND(1.0*SUM(FCT.IP_CNT)/SUM(1), 1) NAGU 'IP-d',
ROUND(1.0*SUM(FCT.REQUEST_CNT)/SUM(1), 1) NAGU 'Päringud',
USA.DIM_USER_AGENT_ID NAGU 'ID',
MAX(USA.USER_AGENT_NK) NAGU 'Kasutaja Agent',
MAX(USA.AGENT_BOT) NAGU 'Robot'
KUST
FCT_ACCESS_USER_AGENT_DD FCT,
DIM_USER_AGENT USA
KUS FCT.DIM_USER_AGENT_ID = USA.DIM_USER_AGENT_ID
JA datetime(FCT.EVENT_DT, 'unixepoch') >= date('now', '-30 day')
GRUPPEERI USA.DIM_USER_AGENT_ID, strftime('%d.%m.%Y', datetime(FCT.EVENT_DT, 'unixepoch'))
KORDESTI SUM(FCT.BYTES) DESC, FCT.EVENT_DT
PIIRANG 10Kasutades päeva ja agent ID atribuute, on võimalik kiiresti leida ja jälgida statistikat eraldi kasutajagruppide päevade kaupa. Vajadusel saab kiiresti leida detailset teavet ststage tabelist.
Kuidas saada teavet?
seda saab veel tõhusamaks muuta, kui integreerida täiendavaid andmeallikaid, tuua sisse uusi agregatsiooni ja gruppimise tasandeid.
Põhisihid ja entiteedid
Põhisihid sisaldavad teavet entiteetide kohta: veebilehed, pildid, videod ja helisisu, kaupluse puhul - tooted.
Mõisted täidavad mõõtmete rolli ja atribuudi muudatuste salvestamise protsessi nimetatakse ajalukseks. Andmebaasis rakendatakse seda protsessi sageli aeglaselt muutuva mõõtmena (SCD).
Põhjalike andmete allikad võivad olla väga erinevad süsteemid, seega on neid peaaegu alati vaja integreerida.
Aeglaselt muutuva mõõtme
DIM_REQUEST mõõde sisaldab teavet saidi päringute kohta ajaloolises vormis.
SCD2 tabel
CREATE TABLE DIM_REQUEST ( /* scd table for user requests */
DIM_REQUEST_ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
DIM_REQUEST_ID_HIST INTEGER NOT NULL DEFAULT -1,
REQUEST_NK TEXT NOT NULL DEFAULT 'n.a.', /* request without ?parameters */
PAGE_TITLE TEXT NOT NULL DEFAULT 'n.a.',
PAGE_DESCR TEXT NOT NULL DEFAULT 'n.a.',
PAGE_KEYWORDS TEXT NOT NULL DEFAULT 'n.a.',
DELETE_FLAG INTEGER NOT NULL DEFAULT 0,
UPDATE_DT INTEGER NOT NULL DEFAULT 0,
UNIQUE (REQUEST_NK, DIM_REQUEST_ID_HIST)
);
INSERT INTO DIM_REQUEST (DIM_REQUEST_ID) VALUES (-1);Sellele lisaks loome ühe vaate, mis kajastab alati kõiki kirjeid viimases olekus. See on vajalik mõõtme laadimiseks.

Praegune SCD2 vaade
/* Content: actual view on scd table */
SELECT HI.DIM_REQUEST_ID,
HI.DIM_REQUEST_ID_HIST,
HI.REQUEST_NK,
HI.PAGE_TITLE,
HI.PAGE_DESCR,
HI.PAGE_KEYWORDS,
NK.CNT AS HIST_CNT,
HI.DELETE_FLAG,
strftime('%d.%m.%Y %H:%M', datetime(HI.UPDATE_DT, 'unixepoch')) AS UPDATE_DT
FROM
( SELECT REQUEST_NK, MAX(DIM_REQUEST_ID) AS DIM_REQUEST_ID, SUM(1) AS CNT
FROM DIM_REQUEST
GROUP BY REQUEST_NK
) NK,
DIM_REQUEST HI
WHERE 1 = 1
AND NK.REQUEST_NK = HI.REQUEST_NK
AND NK.DIM_REQUEST_ID = HI.DIM_REQUEST_ID;Ja vaade, kus iga kirje kohta on kogutud ajalooline teave. See on vajalik ajalooliselt täpse seose loomiseks faktidega.

Ajalooline esitus SCD2
/* Content: actual view on scd table */
SELECT SCD.DIM_REQUEST_ID,
SCD.DIM_REQUEST_ID_HIST,
SCD.REQUEST_NK,
SCD.PAGE_TITLE,
SCD.PAGE_DESCR,
SCD.PAGE_KEYWORDS,
SCD.DELETE_FLAG,
CASE
WHEN HIS.UPDATE_DT IS NULL
THEN 1
ELSE 0 END ACTIVE_FLAG,
SCD.DIM_REQUEST_ID_HIST AS ID_FROM,
SCD.DIM_REQUEST_ID AS ID_TO,
CASE
WHEN SCD.DIM_REQUEST_ID_HIST=-1
THEN 3600
ELSE IFNULL(SCD.UPDATE_DT,3600)
END AS TIME_FROM,
CASE
WHEN HIS.UPDATE_DT IS NULL
THEN 253370764800
ELSE HIS.UPDATE_DT
END AS TIME_TO,
CASE
WHEN SCD.DIM_REQUEST_ID_HIST=-1
THEN STRFTIME('%d.%m.%Y %H:%M', DATETIME(3600, 'unixepoch'))
ELSE STRFTIME('%d.%m.%Y %H:%M', DATETIME(IFNULL(SCD.UPDATE_DT,3600), 'unixepoch'))
END AS ACTIVE_FROM,
CASE
WHEN HIS.UPDATE_DT IS NULL
THEN STRFTIME('%d.%m.%Y %H:%M', DATETIME(253370764800, 'unixepoch'))
ELSE STRFTIME('%d.%m.%Y %H:%M', DATETIME(HIS.UPDATE_DT, 'unixepoch'))
END AS ACTIVE_TO
FROM
DIM_REQUEST SCD
LEFT OUTER JOIN DIM_REQUEST HIS
ON SCD.REQUEST_NK = HIS.REQUEST_NK AND SCD.DIM_REQUEST_ID = HIS.DIM_REQUEST_ID_HIST;Andmete agregatsioon
Kokkusurumine (agregatsioon) võimaldab hinnata andmeid kõrgemal tasemel ning tuvastada anomaaliaid ja trende, mis ei ole nähtavad detailsetes aruannetes.
Näiteks lisame mõõtmisele, millel on DIM_HTTP_STATUS staatuse koodid, rühma:
STATUS / RÜHM
0xx / n.a.
1xx / Informatiivne
2xx / Edukas
3xx / Suunamine
4xx / Kliendi viga
5xx / Serveri viga
Kasutajate agentide mõõtmine DIM_USER_AGENT sisaldab atribuute AGENT_OS ja AGENT_BOT, mis vastutavad rühmade eest. Need saab täita ETL protsessi käigus:
DIM_USER_AGENTi laadimine
/* Propagate the user agent from access log */
INSERT INTO DIM_USER_AGENT (USER_AGENT_NK, AGENT_OS, AGENT_ENGINE, AGENT_DEVICE, AGENT_BOT, UPDATE_DT)
WITH CLS AS (
SELECT BROWSER
FROM STG_ACCESS_LOG WHERE LENGTH(BROWSER)>1
GROUP BY BROWSER
)
SELECT
CLS.BROWSER AS USER_AGENT_NK,
CASE
WHEN INSTR(CLS.BROWSER,'Macintosh')>0
THEN 'Macintosh'
WHEN INSTR(CLS.BROWSER,'iPhone')>0
OR INSTR(CLS.BROWSER,'iPad')>0
OR INSTR(CLS.BROWSER,'iPod')>0
OR INSTR(CLS.BROWSER,'Apple TV')>0
OR INSTR(CLS.BROWSER,'Darwin')>0
THEN 'iOS'
WHEN INSTR(CLS.BROWSER,'Android')>0
THEN 'Android'
WHEN INSTR(CLS.BROWSER,'X11;')>0 OR INSTR(CLS.BROWSER,'Wayland;')>0 OR INSTR(CLS.BROWSER,'linux-gnu')>0
THEN 'Linux'
WHEN INSTR(CLS.BROWSER,'BB10;')>0 OR INSTR(CLS.BROWSER,'BlackBerry')>0
THEN 'BlackBerry'
WHEN INSTR(CLS.BROWSER,'Windows')>0
THEN 'Windows'
ELSE 'n.a.' END AS AGENT_OS, -- OS
CASE
WHEN INSTR(CLS.BROWSER,'AppleCoreMedia')>0
THEN 'AppleWebKit'
WHEN INSTR(CLS.BROWSER,') ')>1 AND LENGTH(CLS.BROWSER)>INSTR(CLS.BROWSER,') ')
THEN COALESCE(SUBSTR(CLS.BROWSER, INSTR(CLS.BROWSER,') ')+2, LENGTH(CLS.BROWSER) - INSTR(CLS.BROWSER,') ')-1), 'N/A')
ELSE 'n.a.' END AS AGENT_ENGINE, -- Engine
CASE
WHEN INSTR(CLS.BROWSER,'iPhone')>0
THEN 'iPhone'
WHEN INSTR(CLS.BROWSER,'iPad')>0
THEN 'iPad'
WHEN INSTR(CLS.BROWSER,'iPod')>0
THEN 'iPod'
WHEN INSTR(CLS.BROWSER,'Apple TV')>0
THEN 'Apple TV'
WHEN INSTR(CLS.BROWSER,'Android ')>0 AND INSTR(CLS.BROWSER,'Build')>0
THEN COALESCE(SUBSTR(CLS.BROWSER, INSTR(CLS.BROWSER,'Android '), INSTR(CLS.BROWSER,'Build')-INSTR(CLS.BROWSER,'Android ')), 'n.a.')
WHEN INSTR(CLS.BROWSER,'Android ')>0 AND INSTR(CLS.BROWSER,'MIUI')>0
THEN COALESCE(SUBSTR(CLS.BROWSER, INSTR(CLS.BROWSER,'Android '), INSTR(CLS.BROWSER,'MIUI')-INSTR(CLS.BROWSER,'Android ')), 'n.a.')
ELSE 'n.a.' END AS AGENT_DEVICE, -- Device
CASE
WHEN INSTR(LOWER(CLS.BROWSER),'yandex.com')>0
THEN 'yandex'
WHEN INSTR(LOWER(CLS.BROWSER),'googlebot')>0
THEN 'google'
WHEN INSTR(LOWER(CLS.BROWSER),'bingbot')>0
THEN 'microsoft'
WHEN INSTR(LOWER(CLS.BROWSER),'ahrefsbot')>0
THEN 'ahrefs'
WHEN INSTR(LOWER(CLS.BROWSER),'jobboersebot')>0 OR INSTR(LOWER(CLS.BROWSER),'jobkicks')>0
THEN 'job.de'
WHEN INSTR(LOWER(CLS.BROWSER),'mail.ru')>0
THEN 'mail.ru'
WHEN INSTR(LOWER(CLS.BROWSER),'baiduspider')>0
THEN 'baidu'
WHEN INSTR(LOWER(CLS.BROWSER),'mj12bot')>0
THEN 'majestic-12'
WHEN INSTR(LOWER(CLS.BROWSER),'duckduckgo')>0
THEN 'duckduckgo'
WHEN INSTR(LOWER(CLS.BROWSER),'bytespider')>0
THEN 'bytespider'
WHEN INSTR(LOWER(CLS.BROWSER),'360spider')>0
THEN 'so.360.cn'
WHEN INSTR(LOWER(CLS.BROWSER),'compatible')>0 OR INSTR(LOWER(CLS.BROWSER),'http')>0
OR INSTR(LOWER(CLS.BROWSER),'libwww')>0 OR INSTR(LOWER(CLS.BROWSER),'spider')>0
OR INSTR(LOWER(CLS.BROWSER),'java')>0 OR INSTR(LOWER(CLS.BROWSER),'python')>0
OR INSTR(LOWER(CLS.BROWSER),'robot')>0 OR INSTR(LOWER(CLS.BROWSER),'curl')>0 OR INSTR(LOWER(CLS.BROWSER),'wget')>0
THEN 'other'
ELSE 'n.a.' END AS AGENT_BOT, -- Bot
STRFTIME('%s','now') AS UPDATE_DT
FROM CLS
LEFT OUTER JOIN DIM_USER_AGENT TRG
ON CLS.BROWSER = TRG.USER_AGENT_NK
WHERE TRG.DIM_USER_AGENT_ID IS NULLAndmete integreerimine
See hõlmab andmete edastamise organisatsiooni operatsioonisüsteemist aruanne. Selleks on vajalik luua staažitabel struktuuriga, mis on sarnane allikale.
Staažisse satub teave veebilehtede kohta CMS-i varukoopiast sisestuspäringute kujul.
Ajaloolise tabeli DIM_REQUEST põhialuste laadimine toimub kolmes etapis: uute võtmete ja atribuutide laadimine, olemasolevate värskendamine ja kustutatud rekordite fikseerimine.
Uute SCD2 rekordite laadimine
/* Load request table SCD from master data */
INSERT INTO DIM_REQUEST (DIM_REQUEST_ID_HIST, REQUEST_NK, PAGE_TITLE, PAGE_DESCR, PAGE_KEYWORDS, DELETE_FLAG, UPDATE_DT)
WITH CLS AS ( -- prepare keys
SELECT
'/' || NAME AS REQUEST_NK,
TITLE AS PAGE_TITLE,
CASE WHEN DESCRIPTION = '' OR DESCRIPTION IS NULL
THEN 'n.a.' ELSE DESCRIPTION
END AS PAGE_DESCR,
CASE WHEN KEYWORDS = '' OR KEYWORDS IS NULL
THEN 'n.a.' ELSE KEYWORDS
END AS PAGE_KEYWORDS
FROM STG_CMS_MENU
WHERE CONTENT_TYPE != 'folder' -- only web pages
AND PAGE_TITLE != 'n.a.' -- master data which make sense
)
/* new records from stage: CLS */
SELECT
-1 AS DIM_REQUEST_ID_HIST,
CLS.REQUEST_NK,
CLS.PAGE_TITLE,
CLS.PAGE_DESCR,
CLS.PAGE_KEYWORDS,
0 AS DELETE_FLAG,
STRFTIME('%s','now') AS UPDATE_DT
FROM CLS
LEFT OUTER JOIN
(
SELECT
DIM_REQUEST_ID,
REQUEST_NK,
PAGE_TITLE,
PAGE_DESCR,
PAGE_KEYWORDS
FROM DIM_REQUEST_V_ACT
) TRG ON CLS.REQUEST_NK = TRG.REQUEST_NK
WHERE TRG.REQUEST_NK IS NULL -- no such record in data martSCD2 atribuutide värskendamine
/* Load request table SCD from master data */
INSERT INTO DIM_REQUEST (DIM_REQUEST_ID_HIST, REQUEST_NK, PAGE_TITLE, PAGE_DESCR, PAGE_KEYWORDS, DELETE_FLAG, UPDATE_DT)
WITH CLS AS ( -- prepare keys
SELECT
'/' || NAME AS REQUEST_NK,
TITLE AS PAGE_TITLE,
CASE WHEN DESCRIPTION = '' OR DESCRIPTION IS NULL
THEN 'n.a.' ELSE DESCRIPTION
END AS PAGE_DESCR,
CASE WHEN KEYWORDS = '' OR KEYWORDS IS NULL
THEN 'n.a.' ELSE KEYWORDS
END AS PAGE_KEYWORDS
FROM STG_CMS_MENU
WHERE CONTENT_TYPE != 'folder' -- only web pages
AND PAGE_TITLE != 'n.a.' -- master data which make sense
)
/* updated records from stage: CLS and build reference to history: HIST */
SELECT
HIST.DIM_REQUEST_ID AS DIM_REQUEST_ID_HIST,
HIST.REQUEST_NK,
CLS.PAGE_TITLE,
CLS.PAGE_DESCR,
CLS.PAGE_KEYWORDS,
0 AS DELETE_FLAG,
STRFTIME('%s','now') AS UPDATE_DT
FROM CLS,
DIM_REQUEST_V_ACT TRG,
DIM_REQUEST HIST
WHERE CLS.REQUEST_NK = TRG.REQUEST_NK
AND TRG.DIM_REQUEST_ID = HIST.DIM_REQUEST_ID
AND ( CLS.PAGE_TITLE != HIST.PAGE_TITLE /* changes only */
OR CLS.PAGE_DESCR != HIST.PAGE_DESCR
OR CLS.PAGE_KEYWORDS != HIST.PAGE_KEYWORDS )Kustutatud SCD2 rekordid
/* Load request table SCD from master data */
INSERT INTO DIM_REQUEST (DIM_REQUEST_ID_HIST, REQUEST_NK, PAGE_TITLE, PAGE_DESCR, PAGE_KEYWORDS, DELETE_FLAG, UPDATE_DT)
WITH CLS AS ( -- prepare keys
SELECT
'/' || NAME AS REQUEST_NK,
TITLE AS PAGE_TITLE
FROM STG_CMS_MENU
WHERE CONTENT_TYPE != 'folder' -- only web pages
AND PAGE_TITLE != 'n.a.' -- master data which make sense
)
/* deleted records in data mart: TRG */
SELECT
TRG.DIM_REQUEST_ID AS DIM_REQUEST_ID_HIST,
TRG.REQUEST_NK,
TRG.PAGE_TITLE,
TRG.PAGE_DESCR,
TRG.PAGE_KEYWORDS,
1 AS DELETE_FLAG,
STRFTIME('%s','now') AS UPDATE_DT
FROM (
SELECT
DIM_REQUEST_ID,
REQUEST_NK,
PAGE_TITLE,
PAGE_DESCR,
PAGE_KEYWORDS
FROM DIM_REQUEST_V_ACT
WHERE PAGE_TITLE != 'n.a.' -- track master data only
AND DELETE_FLAG = 0 -- not already deleted
) TRG
LEFT OUTER JOIN CLS ON TRG.REQUEST_NK = CLS.REQUEST_NK
WHERE CLS.REQUEST_NK IS NULL -- no such record in stageIga andmeallikas tuleb saata formaalse kirjeldusega, näiteks failis readme.txt:
Andmete vastuvõtja formaalselt/tehniliselt: nimi, e-posti aadress
Andmete pakkuja formaalselt/tehniliselt: nimi, e-posti aadress
Andmeallikas: failitee, teenuste nimed
Juurdepääsu teave andmetele: kasutajad ja paroolid
Andmete liikumise skeem aitab hoolduse ja uuendamise protsessis, näiteks tekstivormis:
Faili liikumine. Allikas: ftp.domain.net: /logs/access.log Eesmärk: /var/www/access.log
Lugemine st-stage. Eesmärk: STG_ACCESS_LOG
Laadimine ja transformatsioon. Eesmärk: FCT_ACCESS_REQUEST_REF_HH
Laadimine ja transformatsioon. Eesmärk: FCT_ACCESS_USER_AGENT_DD
Aruanne. Eesmärk: /var/www/report.html
Kokkuvõte
Seega kirjeldab artikkel selliseid mehhanisme nagu põhiteabe integreerimine ja uute kogumise tasemete sisseviimine. Need on vajalikud andmehoidlate ehitamisel, et saada täiendavaid teadmisi ja parandada teabe kvaliteeti.
Allikas: habr.com
