Rohkem statistikat oma vÀikeses sÀilitamises

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 oma vÀikeses sÀilitamises 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.

Rohkem statistikat oma vÀikeses sÀilitamises

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_DT

NÀ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.

Rohkem statistikat oma vÀikeses sÀilitamises

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 DESC

Enamasti 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.

Rohkem statistikat oma vÀikeses sÀilitamises

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_DT

Intensiivne liiklustarbimine

Tabelist on nÀha kÔige aktiivsemaid kasutajagruppe ja nende aktiivsuse pÀeva.
KÔige aktiivsemad kuuluvad Linuxi klastrisse.

Rohkem statistikat oma vÀikeses sÀilitamises

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 10

Kasutades 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?

Teave failist access.log 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.

Rohkem statistikat oma vÀikeses sÀilitamises

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.

Rohkem statistikat oma vÀikeses sÀilitamises

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 NULL

Andmete 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 mart

SCD2 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 stage

Iga 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

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster