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