Jeden velký select nebo více menších?

Smokie

Jeden velký select nebo více menších?
« kdy: 02. 11. 2011, 17:12:11 »
Zdravím,

riešim dilemu. Robím v PHP sklad s tovarovými kartami, kde každá tovarová karta môže mať niekoľko svojich variácií.

Takže v modelovej situácii mám 10 tovarových kariet a každá má 100 variácii. Čo je dokopy 1000 variácií, teda riadkov v databáze.

Výpis výzerá tak, že sú v tabuľke vypísané tovarové karty a pod každou tovarovou kartou sú vypísané jej variácie.

Je rýchlejšie a menej náročne na server v jednom selecte vypísať všetky variácie a ich výpis rozdeliť k tovarovým kartám (čize 1 SELECT s 1000 výsledkami) alebo pod každou tovarovou kartou urobiť select, ktorý vytiahne iba jej variácie (čiže 10 SELECTov, kde každý vygeneruje 100 výsledkov)?
« Poslední změna: 02. 11. 2011, 22:03:40 od Petr Krčmář »


Logik

  • *****
  • 1 043
    • Zobrazit profil
    • E-mail
Re: 1 select s 1000 riadkami vs. 10 selectov so 100 riadkami
« Odpověď #1 kdy: 02. 11. 2011, 17:17:02 »
To snad dá rozum, že jeden s tisícem, protože odpadne 99x režije dotazu. Jediná výjimka je u mysql, kdyby ten jeden dotaz byl složitej a selhal na něm optimalizítor.

Smokie

Re: 1 select s 1000 riadkami vs. 10 selectov so 100 riadkami
« Odpověď #2 kdy: 02. 11. 2011, 21:31:00 »
Dufal som v tuto odpoved. Dakujem. :)

KapitánRUM

Re: 1 select s 1000 riadkami vs. 10 selectov so 100 riadkami
« Odpověď #3 kdy: 02. 11. 2011, 21:49:14 »
Pokusil bych se si na to sednout a pořádně se na to podívat.
Možná by šlo data šikovně rozdělit do více tabulek a vymyslet to tak, aby většina problémů odpadla díky návrhu. Viděl jsem desítky různých skladů, skladových karet a DB v malých firmách i v koncernech.

Také nemohu souhlasit s tím, že je lepší najednou načíst do paměti všechny skladové karty.
Co až karet nebude 10, ale třeba 1000. Ano, obecně je rychlejší, načíst záznamy naráz a pak si je třídit v paměti, ale vůbec není zmíněno, jestli se systémem bude pracovat naráz víc lidí.
Co až nad tím budete chtít udělat e-shop nebo nějaký jiný systém?

Pokud se v určitou dobu zeptáte na takovouhle otázku, kdy nejste schopen vybrat karty pomocí jednoduchého SELECTu, měl byste se zastavit a popřemýšlet, jestli návrh DB je opravdu dobrý.

No a na to existují odpovědi od dvou různých lidí.
A) nafoukaný pitomec řekne, že nemohl udělat chybu a že návrh je v pořádku
B) rozumný člověk se zeptá na svůj názor ještě někoho dalšího, který mu to potvrdí nebo vyvrátí

Takže, na Vašem místě bych vygeneroval zjednodušené schéma DB a hodil ho sem do fóra s tím, že se dozvíte názory dalších lidí.

pecko

  • ***
  • 105
    • Zobrazit profil
    • E-mail
Re: Jeden velký select nebo více menších?
« Odpověď #4 kdy: 03. 11. 2011, 09:44:08 »
ja osobne by som toto riesil teda minimalne dvoma tabulkami:

`karty` a `karty_tovar` (napriklad ;) )... v karty by bol len jednoduchy zoznam kariet napriklad s nejakym zakladnym popisom (neviem presne, ake info vztahujuce sa len k samotnej karte ako takej tam potrebujes). v karty_tovar by cez FK bolo id karty a id tovaru (prip. dalsie nevyhnutne stlpce). pri listovani potom zobrazis len X zaznamov z `karty` a nic viac. ak budes chciet detail, kliknes si na kartu a dalsim selectom si zobrazis detail. to budes mat teda 1x select s X (v tvojom priklade 10) riadkami + 1x select s jednym riadkom detailu. podla mna rozumnejsie aj vzhladom na to, co pisal KapitánRUM


Smokie

Re: Jeden velký select nebo více menších?
« Odpověď #5 kdy: 03. 11. 2011, 09:51:45 »
Navrh vyzera tak, ze karty a variacie su v dvoch tabulkach a prepojene su len cudzim klucom.

table_tovar
- ID_tovaru

table_variacie
- ID_variacie
- FK_tovaru

Pre prehladnost a usporu neuvadzam ine stlpce ako nazov, cena,...

Vsetky tovarove karty sa do pamate nenacitaju, vzdy iba nejakych 10 alebo 20. Zalezi na nastaveni paginatoru. Jedna tovarova karta by nemala mat viac ako 25 variacii (5x5 je pri vytváraní tovarovej karty). A aj tento pocet tovarovych kariet a variacii sa nacita iba v backende. Vo frontende (teda eshop) sa nacita iba mozno maximalne 50 tovarovych kariet, ale aj to iba nazov a fotografia. Variacie sa objavia az pri objednavani, ale to tiez uz iba pri jednej tovarovej karte. Cize k zahlteniu nema ako dojst.

pecko

  • ***
  • 105
    • Zobrazit profil
    • E-mail
Re: Jeden velký select nebo více menších?
« Odpověď #6 kdy: 03. 11. 2011, 09:55:31 »
Vsetky tovarove karty sa do pamate nenacitaju, vzdy iba nejakych 10 alebo 20. Zalezi na nastaveni paginatoru. Jedna tovarova karta by nemala mat viac ako 25 variacii (5x5 je pri vytváraní tovarovej karty). A aj tento pocet tovarovych kariet a variacii sa nacita iba v backende. Vo frontende (teda eshop) sa nacita iba mozno maximalne 50 tovarovych kariet, ale aj to iba nazov a fotografia. Variacie sa objavia az pri objednavani, ale to tiez uz iba pri jednej tovarovej karte. Cize k zahlteniu nema ako dojst.

potom to mas podla mna ok:) ja by som siel zrejme cestou dotahovania detailov extra selectom az po kliknuti na konkretnu kartu). myslim, ze to je taka stredna cesta:)

Logik

  • *****
  • 1 043
    • Zobrazit profil
    • E-mail
Re: Jeden velký select nebo více menších?
« Odpověď #7 kdy: 04. 11. 2011, 14:45:41 »
To, že se dělá jeden select přeci neznamená, že je vše v paměti. Normálně se to sekvenčně zpracuje a vyplivne. Samozřejmě, pokud nejsou třeba všechny karty, tak se nebude dělat select na všechny karty, ale to je snad jasný. Zdá se mi, že se řešej blbiny.