Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
SURROGATE KEY
SURROGATE KEY
Documento Interno
Documento: 52244934.doc
Edizione:1.0
Data: 31 ottobre 20022
INDICE
1 COSA SONO..................................................................................2
2
1 COSA SONO
Legenda documento:
K Chiave
PK Chiave Primaria
FK Chiave Secondaria
SK Chiave Surrogata
NK Chiave Naturale (o intelligente)
SA Staging Area
DW Data Warehouse
v Vantaggio
sv Svantaggio
2
Ad esse non è associata nessuna informazione di business, quindi né il
valore né la struttura devono essere modificate se cambia tale
informazione.
Le colonne di business che erano usate come porzioni di PK (NK)
diventano ora semplici colonne di dati che possono essere modificate,
aggiunte o eliminate con facilità. L’unicità dei valori di queste colonne di
business può ancora essere garantita dall’utilizzo di indici secondari.
ES:
caso NK caso SK
CLIENTI CLIENTI
PK PK
NUM C1 C2 C3 C4 CLI NUM C1 C2 C3 C4
CLI SK CLI
ID_1 1 ID_1
ID_2 2 ID_2
ID_3 3 ID_3
ORDINI ORDINI
PK PK
NUM DATA B1 B2 B3 ORD CLI DATA B1 B2 B3
CLI ORD SK SK ORD
(FK) (FK)
ID_1 0103 1 1 0103
02 02
ID_1 0203 2 1 0203
02 02
ID_1 0803 3 1 0803
02 02
ID_2 0106 4 2 0106
02 02
ID_2 0206 5 2 0206
02 02
ID_3 0909 6 3 0909
02 02
NB: CLI SK non fa più parte della chiave
Se eseguo una query del tipo “Tutti i NUM CLI e le loro DATA ORD” mentre nel
caso NK interrogo la sola Tab. ORDINI, nel caso SK devo interrogare sia la
Tab. ORDINI che la Tab. CLIENTI.
La situazione è dannosa anche quando all’UT è permesso inserire nuove righe
con tools ad hoc. Non solo è richiesta la comprensione delle colonne SK, ma in
qualche modo i nuovi valori devono essere generati.
3
2.1 PERFORMANCE
Può differire tra le due tecniche:
una indagine su una singola colonna SK può essere più veloce che su .una
multicolonna NK. D’altra parte, un semplice incremento della SK può causare
problemi di contesa indici che non si trovano con una distribuzione random
delle NK.
Quando vengono usate PK SK potrebbero essere richiesti indici extra sulle
colone di business che erano usate come parti di PK NK; questi indici possono
essere necessari per mantenere l’unicità e soddisfare query ed essi possono
fare aggiornamenti più lenti.
Gli statement SQL sono differenti tra le due tecniche:
da una parte è più facile collegare tab con SK perché coinvolgono una sola
colonna, dall’altra è stato notato che le più veloci SK possono aumentare il
numero di join (perché le colonne di business dalle Tab padre non sono ripetute
nelle Tab figlie). In altre parole, potrebbero esserci meno join quando si usano
le NK (o K intelligenti), ma potrebbe essere più difficile codificarli perché
coinvolgono un maggior numero di colonne.
3 COME SI CREANO
3.1 ANNOTAZIONI
4
- Ogni join key tra Dim e Fact dovrebbe essere fatto con SK o interi anonimi,
non con NK o smart key;
- Fare le SK assegnando 1 alla prima istanza della k, 2 alla seconda, ……..;
- E’ impossibile dire una qualunque cosa sul valore o il contesto del record
dimensionale solo guardando il valore della SK;
- Tutte le SK sono interi 4-Byte (e per piccole dimensioni interi 2-Byte)
5
Schema 1.a : Primo caricamento di una Tab. dim.le
Insieme originale
completo dei
record Dim.li
PROD_KEY Generatore di SK
DESC_PROD (partendo da 1)
CATEGORY
SIZE
….
Insieme originale
dei record Dim.li
caricabili
1.b) dalla seconda volta in poi, quando si leggono i dati di produzione che
definiscono la Dim, si devono prendere alcune complicate decisioni:
- la più facile: riconoscere nuovi record che sono stati aggiunti alla Dim nel
sistema di produzione e assegnati a nuove K produzione. Immaginiamo, per
semplicità, che il dato di produzione sia un singolo campo, pulito, ben
mantenuto chiamato PROD_KEY (le stesse considerazioni si possono fare se
l’unicità dei record della Dim. Prod è definita da due differenti campi).
Ogni volta che estrai informazioni dalla Dim. Prod si deve controllare che
tutte le K prodotto non esistano già. Concettualmente basterebbe guardare
nella Tab Dim.le del W dove la K prodotto è memorizzata come campo
ordinario. Invece, conviene avere una Tab di Lookup separata, piuttosto
che usare la reale Tab. Dim.le del W.
6
allora viene aggiunto un nuovo record al DW
Come accennato sopra, il metodo più veloce per scoprire se una K esiste già è
avere una speciale Tab di Lookup per le PROD_ KEY precedentemente
riconosciute, preferibilmente ordinate ed indicizzate per un riferimneto il più
veloce possibile.
PROD_KEY CURRENT_SURR_KEY
PROD02HE77 2235
PROD02GF23 5468
PROD02HL18 6221
…
Questa Tab di Lookup ha meno righe della Tab. Dim.le, perché ha una sola
riga per ogni PROD_KEY riconosciuta, e contiene la SK usata più di recente con
quella PROD_KEY.
Ogni mattina sono processati i dati entranti nella Dim Prod per vedere se la
PROD_KEY esiste già o meno:
7
Schema 1.b : Refresh di una Tab. dim.le dopo il primo caricamento
Record Record
dim.le dim.le
esistente entrante
Tab. di Lookup
(PROD_KEY↔SK)
la PROD_KEY NO
esiste già?
New SK = Old SK +1
SI
CONFRONTO Prendo la
(campo x CURRENT_SURR_KEY
campo) Creo un nuovo record
Tipo 1
SOVRASCRIVO CARICO
il record sul DB il record sul DB
8
3.2.2 SK per le Fact
Per ogni record in ingresso nella Fact:
- si prende la PROD_KEY dimensionale (nel record della Fact)
- si rimpiazza con la corretta SK corrente
Nota 1: nel record della Fact non si mantiene il valore della PROD_KEY; tale
valore lo si può comunque continuare a trovare nel record associato nella
Tab dim.le
Nota 2: se le componenti la K PROD sono 4-12, alllora sono necessarie 4-12
Tab. di Lookup per ricavare la giusta SK
- si carica il record sul DB.
PASSI ALGORITMO
Time key
Record della Fact Rimpiazzo Lookup corrente
1
con gli ID PROD TIME_ID
con la SK
TIME_ID
TIME_ID TIME_KEY
TIME_KEY
PROD_ID
STORE_ID 2
PROMOTION_ID
$_SALES
Prod key
UNIT_SALES
Rimpiazzo Lookup corrente
$_COST
… PROD_ID
con la SK PROD_ID
PROD _KEY PROD_KEY
Store key
Lookup corrente
Rimpiazzo
STORE_ID
con la SK STORE_ID
STORE _KEY STORE_KEY
4
Promotion key
Lookup corrente
Record della Fact con 5 Rimpiazzo
gli ID PROD PROMOTION_ID PROMOTION_ID
con la SK PROMOTION_KEY
TIME_KEY PROMOTION _KEY
PROD_ KEY
STORE_ KEY
PROMOTION_ KEY
$_SALES
UNIT_SALES
$_COST
…
6
CARICAMENTO dei
record sul DB
9
Metodo veloce
Far scorrere tutti i record in input seguendo (in multithread) tutti i passi
dell’algoritmo.
NOTA 1 (multithread) :
- rec 1 al 1° passo (subito si accoda il rec 2)
- rec 1 al 2° passo (e rec 2 al 1° )
- e così via.
Affinchè tutto avvenga velocemente, ogni rec devono seguire tutti i
passi e “volare” sulla memoria, senza essere scritto sul disco fino alla
fine.
CONCLUSIONI
11
4 SLOWLY CHANGING DIMENSIONS (SCD)
ES. 1
“Una Dim. Prodotto in cui la descrizione dettagliata di un dato prodotto viene
occasionalmente aggiornata”
La modifica può riguardare un particolare così piccolo che la produzione non
assegna il prodotto ad un nuovo SKU (quello che il DW sta usando come PK
della Dim. Prod), ma tuttavia dà al team_DW la descrizione di prodotto corrente
(modificata). Quando questo accade il team_DW si trova di fronte a un
dilemma: se il DW deve tenere traccia sia della OLD che della NEW descrizione
come devono essere usate le chiavi? E dove mettere i due valori degli attributi
cambiati?
ES. 2
“Nomi dei settori e dei distretti di un Sistema di Vendite”.
Ogni società che ha un sistema di vendite è facile che riassegni nomi di settori
e distretti ogni 1-2 anni.
1. Sovrascrittura
2. Creazione di un nuovo record dimensionale
3. Creazione di un campo “valore corrente”
4.1.1 TECNICA 1
- la più semplice
- la più veloce
- ma non permette di tenere traccia della storia
Tuttavia è usata molta frequentemente quando il team_DW decide
legittimamente che il vecchio valore degli attributi dimensionali cambiati non è
interessante.
12
4.1.2 TECNICA 2
- è molto comune
- ha molti vantaggi
ES. lo schema DW è quello di una società di spedizioni (per una società
manifatturiera) in cui la Dim. Prod è una delle più importanti
Dim PERIODO
TIME_KEY
Dim PROD
PROD_KEY …
DESC
TIPO
CATEGORIA Fact VENDITE Dim SHIP_TO
SKU#
PKG_TYPE TIME_KEY SHIP_TO_KEY
PROD_KEY
… SHIP_TO_KEY
SHIP_MADE_KEY …
SHIP_FROM_KEY
QTA VENDUTA
LINEITEM_VALUE
Dim SHIP_MADE
…
SHIP_MADE_KEY
Dim SHIP_FROM
SHIP_FROM_KEY
Una buona Dim. Prodotto in un Sistema Vendite dovrebbe avere almeno una
cinquantina di attributi che descrivono i prodotti, includendo attributi gerarchici
(es: tipo, categoria) e non (es: tipo di confezione). Un importante attributo
previsto dalle operazioni manifatturiere è il numero SKU assegnato al prodotto.
Iniziamo usando SKU come chiave della Tab. Dim.le Prodotto.
ES. Immaginiamo che avvenga un piccolo cambiamento nel packaging del
SKU#38: la desc del packaging passa da “glued box” a “pasted box”
(incollato). La modifica è così piccola che si decide di non cambiare il numero
SKU del prodotto, o il codice a barre (UPC) stampato sulla scatola.
Se sul DW si vuole comunque tenere traccia della modifica, la soluzione
migliore è creare un nuovo record come se la versione “pasted box”
identificasse un nuovo tipo di prodotto. L’unica differenza tra i due record è la
descrizione del packaging (i numeri SKU sono gli stessi) il solo modo per
13
creare un nuovo record è generalizzare la K della Tab. Dim.le Prodotto ad
essere qualcosa di più del numero SKU. Ad es SKU potrebbe essere SKU+(2 o 3
cifre per indicare la versione)
SKU#38+01 (versione “glued box”)
SKU#38+02 (versione “pasted box”)
Nota che probabilmente dovrai posizionare SKU# in un attributo (campo)
separato della dimensione (vedi la Dim. PROD dello schema sopra) per non
dover obbligare l’applicazione a spezzare la chiave per ricavare l’SKU#
OSSERVAZIONI:
- questa tecnica per SCD è molto potente (perché i nuovi record dimensionali
tracciano automaticamente la storia nella Fact)
- la vecchia versione del record dim.le punta a tutta la storia nella Fact
precedente al cambiamento
- la nuova versione del record dim.le punta a tutta la storia dopo il
cambiamento
- non c’è nessun bisogno di un timestamp nella Tab. Prod per registrare il
cambiamento. Infatti, un timestamp in un record dimensionale potrebbe non
avere senso perché l’evento di interesse è l’utilizzo attuale del nuovo tipo di
prodotto in una vendita. Questa è la miglior registrazione di un record-Fact
con la nuova corretta key Prod.
- Altro vantaggio: si possono tracciare quanti cambiamenti si vogliono per
ogni item dim.le: ogni cambiamento genera un nuovo record e ogni record
traccia perfettamente la storia.
- Svantaggi:
- necessità di generalizzare le K dim.li
- aumento della Tab. dim.le stessa.
4.1.3 TECNICA 3
Ad es, capita spesso nei casi di riallineamento delle vendite dove, nonostante
tu abbia cambiato il nome delle tue regioni di vendita, hai ancora bisogno dello
stato odierno delle vendite nelle regioni “di ieri”, proprio per vedere come
sarebbe stato con la vecchia organizzazione. Si può affrontare ciò non creando
un nuovo record dim.le (come nella Tecnica 2), bensì creando un nuovo campo
contenente il “valore corrente”.
14
TEAM
Sales_Team_Ke Sales_Team_Ke
y y
Team_Name Team_Name
Team_Leader Team_Leader
Region Previous_Region
Current_Region
NB: nessuna modifica è stata fatta alle K dei record dim.li o al numero di record
nella SALES_TEAM. I due campi Current_Region e Previous_Region permettono
di separare tutti i record fact sales correnti da quelli precedenti.
Questo schema permette di tracciare solo i cambiamenti più recenti delle
vendite, ma offre molta flessibilità nel determinare tutta la storia di entrambi
gli schemi di assegnamento vendite.
E’ pensabile, nonostante qualche svantaggio, di generalizzare questo approccio
a più degli ultimi due cambiamenti più recenti.
Se ci sono molti di questi riallineamenti vendite e si desidera tracciarli tutti,
allora probabilmente è la TECNICA 2 quella da usare.
http://www.microsoft.com/technet/treeview/default.asp?
url=/TechNet/prodtechnol/sql/reskit/sql2000/part5/c1961.asp (cap 19)