Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Jedna velika tabela ili vise malih?

[es] :: MySQL :: Jedna velika tabela ili vise malih?

[ Pregleda: 1384 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Milos911
Serbia

Član broj: 219127
Poruke: 1230
37.19.107.*



+303 Profil

icon Jedna velika tabela ili vise malih?21.11.2012. u 17:59 - pre 138 meseci
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.

 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2377 Profil

icon Re: Jedna velika tabela ili vise malih?21.11.2012. u 22:37 - pre 138 meseci
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
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 3453

Jabber: djoka_l


+1462 Profil

icon Re: Jedna velika tabela ili vise malih?22.11.2012. u 13:16 - pre 138 meseci
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.
 
Odgovor na temu

[es] :: MySQL :: Jedna velika tabela ili vise malih?

[ Pregleda: 1384 | Odgovora: 2 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.