Denormalisointia turvallisesti Ougf syysseminaari 4.11.2010 Pörssitalo Helsinki Timo Raitalaakso
Timo Raitalaakso Senior Database Specialist Solita Oy 2001- - 2001 Tampereen Teknillinen korkeakoulu Tietokannat / Ohjelmistoarkkitehtuurit DI Sähkötekniikka OCA DBA 10g http://rafudb.blogspot.com/ 2
Solita 1996 perustettu ohjelmistotalo Ohjelmistoratkaisut Tietovarastointi ja raportointi Integrointi Portaalit ja sähköinen asiointi Toimipisteet Tampere ja Helsinki 180 työntekijää LV 2009 13,5 M 3
Denormalisointia turvallisesti Normalisointi
Normalisointia kolmanteen Tieto tallessa atomisesti Relaation ominaisuudet riippuvat Avaimesta Koko avaimesta Vain avaimesta 5
Denormalisointia turvallisesti Denormalisointi
Nimen denormalisointi http://rafudb.blogspot.com/2009/09/denormalize-safely.html create table isa(isa_id number(10) constraint isa_pk primary key, isa_nimi varchar2(200) not null); create table lapsi(lapsi_id number(10) constraint lapsi_pk primary key, isa_id constraint l_i_fk references isa, lapsi_arvo varchar2(200) not null); Denormalisointi: alter table lapsi add (isa_nimi varchar2(200) not null); Miten varmistat, että lapsi tauluun denormalisoitu tieto yhtenäistä isa taulun tiedon kanssa? 7
Nimen denormalisointi 8
Tiedon eheys perinteisesti Denormalisoidun tiedon populointi triggereillä Samalla yritetään pitää huolta eheydestä Mutating table ongelmia JDBC läpi collection tietotyyppejä käyttävät triggerit ei aina laukea Kaikkien kombinaatioitten hallinta 9
Keinoja eheyden säilyttämiseksi Denormalisoitu kolumni Jätä tieto myös isäkäsitteeseen Sisältö pitää olla sama kuin pääkäsitteessä Ellei isäkäsitettä ole, mallinna se Assert ei käytettävissä Foreign key taulujen välille Check constraint rivin tiedoille Unique constrain rivien yli samassa taulussa (Postgresql 9 exclusion constraints) 10
Turvallisuutta nimen denormalisointiin alter table isa add constraint isa_u unique (isa_nimi,isa_id); alter table lapsi add constraint l_i_2fk foreign key(isa_nimi,isa_id) references isa(isa_nimi,isa_id); ISA 01 Mikki 02 Aku LAPSI 011 01 Vertti Mikki 012 01 Mortti Mikki 021 02 Tupu Aku 022 02 Lupu Aku 023 02 Hupu Aku 11
Älä denormalisoi muutettavaa tietoa Jos tieto kuitenkin muutettavissa, luo vierasavain vasta transaktion lopussa tarkistettavaksi deferrable initially deferred Vai olisiko tietomallissasi puute? isa ja lapsi taulujen väliin taulu isa_versio, minne isa taulun nimet riveille 12
Tuntikirjanpito Suhteen denormalisointi 13
Tuntikirjanpito PersonHour2.task_id voi olla eri projektin task kuin PersonHour2.project_id Luo task2 uniikki avain project_id ja task_id kaksikolle. Tämä on uniikki, koska task2.task_id pääavaimena on uniikki. PersonHour2 vierasavain osoittamaan tähän uniikki avaimeen pelkän pääavaimen sijaan 14
Miten turvallista? task name päivitys UPDATE TASK2 set PROJECT_ID =?, TASK_NAME =? WHERE TASK_ID =?; task2.task_name muutos - Hibernate, päivittää sivutuotteena vierasavaimena käytetyn uniikki avaimen osaa vanhaan arvoon "enq: TM - contention" wait events Korjaa update itse Unindex http://rafudb.blogspot.com/search?q=unindex 15
Kaistan pisteet 16
Kaistan pisteet insert into ajorata (ajorata_id) values (1); insert into ajorata (ajorata_id) values (2); insert into ajoradan_piste (ajoradan_piste_id,ajorata_id) values (11,1); insert into kaista (kaista_id,ajorata_id) values (33,2); insert into kaistan_piste (kaistan_piste_id,ajoradanpiste_id,kaista_id) values (4444,11,33); Pitikö kaistan pisteiden kuulua samalle ajoradalle molempia saantipolkuja? 17
Kaistan pisteet - turvallisemmiksi alter table kaistan_piste add ajorata_id constraint kaistan_piste_ajorata_fk references ajorata; alter table ajoradan_piste add constraint ajoradan_piste_u unique (ajorata_id,ajoradan_piste_id); alter table kaista add constraint kaista_u unique (ajorata_id,kaista_id); alter table kaistan_piste add constraint kaistan_piste_kaista2fk foreign key (ajorata_id,kaista_id) references kaista (ajorata_id,kaista_id); alter table kaistan_piste add constraint kaistan_piste_ap2fk foreign key (ajorata_id,ajoradan_piste_id) references ajoradan_piste (ajorata_id,ajoradan_piste_id); 18
Kaistan pisteet - turvallisemmiksi denormalisointi 19
Pakettikoko ja lähetykset Tuotteella eri kokoisia paketteja Lähetysmäärä pitää olla pakettikoon monikertoja denormalisointi ALTER TABLE LAHETYS ADD CHECK (MOD(LUKUMAARA,PAKETTILUKUMAARA)=0); 11.2 BUG: MERGE IGNORES CHECK CONSTRAINT 20
Vaihtoehto denormalisoinnille ON COMMIT päivittyvä materialisoitu näkymä, minkä toteuttavalle taululle constraint + Ei tarvi denormalisointia sovelluksen puolelta - Tarkistetaan vasta transaktion lopussa - Sarjallistaa päivityksiä -> enq: JI contention http://rwijk.blogspot.com/2010/01/enq-ji-contention.html isän tilakoneen tilojen mukaisten lasten tarkisteisiin 21
Asian henkilöt ASIA VUOKRA KAUPPA * * * Vuokralainen * * Vuokraaja * * Ostaja Myyjä * HENKILO 22
Asian henkilöt VU Vuokra KA Kauppa 23
Asian henkilöt VR Vuokralainen VJ Vuokraaja OS Ostaja MY Myyjä 24
Asian henkilöt VU VR VU VJ KA OS KA MY 25
Asian henkilöt Asialaji asiahenkilo tauluun ja vierasavaimien kautta varmistus tiedon yhtenäisyydestä 26
Asian henkilöt Asialaji denormalisointi suhdetauluihin alter table vuokraaja add asialaji as VU ; Virtuaalikolumni cast numeeriselle tiedolle 27
Yhteenveto Denormaisoidessa jätä kolumnit myös sinne minne ne kuuluvat. Käytä tiedon eheyden saavuttamiseksi tarkisteita mitä saatavilla. Vierasavaimet Uniikki rajoitteet Check rivitasolla Denormalisointia voi käyttää hyväksi taulujen välistä eheyttä vaalimaan. 28
Kiitos! Solita Oy Helsinki Solita Oy Tampere Kaisaniemenkatu 13 A Satakunnankatu 18 A 00100 Helsinki 33210 Tampere +3583 389 1380 +35840 848 0148 contact@solita.fi rafu@solita.fi www.solita.fi rafudb.blogspot.com