[ Milos911 @ 21.11.2012. 17:59 ] @
Zanima me da li je bolje jednu veliku tabelu podeliti na vise manjih? Mislim na podelu po kolonama, ne po redovima.

Pre nego sto nastavim da kazem da sam malo pretrazivao i video da mi pristup nije pogresan, ali zanima me i vase misljenje...

Da dam i primer koji me muci, recimo ovo mi je user sistem (ima jos tabela ali su na isti kalup uradjene) koji sam napravio za jednu prilicno veliku app:

Code (sql):

CREATE TABLE `user_username` (
  `uid` INT(15) NOT NULL AUTO_INCREMENT,
  `utid` INT(11) NOT NULL,
  `username` VARCHAR(150) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `user_confirmed` INT(1) NOT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=19 ;

CREATE TABLE `user_password` (
  `uid` INT(15) NOT NULL,
  `password` VARCHAR(100) NOT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `user_email` (
  `uid` INT(15) NOT NULL,
  `email` VARCHAR(200) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
  `email_confirmed` INT(11) NOT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `user_location` (
  `uid` INT(15) NOT NULL,
  `country_id` INT(15) NOT NULL,
  `state_id` INT(15) NOT NULL,
  `city_id` INT(15) NOT NULL,
  `postal_code_id` INT(15) NOT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

 


Posto sam bio zesci pocetnik kad sam pocinjao da radim ovu app, nisam nista od literature procitao pa sam radio po osecaju.

Vodio sam se logikom da necu svim podacima uvek pristupati. Recimo, kad saljem email korisniku, uzimacu podatke samo iz user_username i user_email tabela. Kad radim matching, pretrazivacu samo user_location i JOIN-ovati user username. Tako da nema potrebe da ove operacije zauzimaju vise memorije nego sto je potrebno, jer realno u vecini slucajeva nisu potrebne.

Ono sto me brine je sto ocekujem veliki broj korisnika (a i drugi delovi baze koji su radjeni na ovaj kalup ce imati mnogo vise podataka). Sigurno postoji neki mali overhead kad se podaci join-uju iz vise tabela (Bogdan jednom rece pristup preko PK-a traje "nista", ali ipak :) ), pa me brine da taj isti overhead ne pobije ostale dobre strane ovog pristupa, tj da ne pocne previse da usporava pristup podacima?

I jedno malo pitanje, da ne otvaram novi topic zbog njega..
Ako nije problem da mi neko kaze da li sam dobro odradio normalizaciju, konkretno ovde imam 4 tabele (static_countries,static_states,static_cities,static_postal_codes) koje na potrebnim mestima left join-ujem preko PK-a? U ovom primeru to radim sa ovom tabelom user_location. U nekim tabelama taj left join radim po 6 puta.

[ bogdan.kecman @ 21.11.2012. 22:37 ] @
ne bih ja to tako ...

razbijanje tabele po sirini vrlo cesto ima smisla ali
- kada se menja dosta velicina tabele
- kada se razbija na "staticni" i "dinamicni" deo (sa jedne strane int i char() a sa druge strane varchar, blob ...)
- kada se razbija na deo koji se "ne menja" i na deo koji se menja (username/pass/datejoined sa jedne i lastjoined sa druge strane npr)
- kada se neki deo koristi "non stop" a neki "retko"

e sad, kod tebe user_username, user_password i user_email treba da budu minimalno u jednoj tabeli, ovako zauzimas previse rama i ne dobijas ni na cemu. user_location kanda moze da ima smisla ali realno, pricamo o par integer-a, veca steta nego korist.

to ti je ujedno i odgovor na pricu o normalizaciji
[ djoka_l @ 22.11.2012. 13:16 ] @
Da dodam još jednu opasku. U svim tabelama su sva polja NOT NULL.
Međutim, organizacijom kakvu si ti napravio dozvoljavaš da, recimo, postoji user koji nema pasword. Moguće je i da postoji slog sa passwordom za koji ne postoji user (što je manji problem).
Tvoja pretpostavka je da će zbog razbijene tabele biti brži pristup ili da će da se koristi manje memorije je potpuno pogrešna. Tabela korisnika nikada nije kritična niti najveća tabela u sistemu. Razmisli o tome koliki je broj on-line korrisnika na tvom sistemu i uporedi sa količinom drugih podataka i videćeš da zbog sumnjive (nepotrebne) optimizacije u stvari ne dobijaš ništa na performansi, samo komplikuješ sebi život.