ugrás a tartalomhoz

egy tábla vs több tábla

Cadeyrn · 2005. Jún. 5. (V), 00.02
Üdv mindenkinek!

Egy rövid kérdésem lenne, igazából a tapasztalatokra lennék kíváncsi a következővel kapcsolatban:
nem sok mennyiségű adat (egyenlőre 10 000 alatt) esetén, ha pl. egy fórumról van szó (tehát téma szerint csoportosítva), akkor melyik érdemesebb: 1 nagy táblában tartani az összes adatot és bejegyzést vagy inkább sok kicsire bontani?

Mivel lekérdezésileg sok különbség nincs, maximum kényelmi szempontok, ezért inkább a sebesség, veszélyek, stb. válaszok érdeklnének.

Előre is köszönöm,
Cadeyrn
 
1

több tábla

Off- · 2005. Jún. 5. (V), 00.37
hasznalj tobb tablat. engem zavarna h nem 3NF-ban lenne! nem lesz gyorsabb, de nem is fognak fellépni anomaliak! ha gyorsitani akarsz meg hasznalj indexet!
2

egy nagy tábla

bbalint · 2005. Jún. 5. (V), 00.37
(szvsz) egy nagy tábla. a hozzászólások legyenek egy helyen és legyen indexelve .

bbalint
3

3NF

Török Gábor · 2005. Jún. 5. (V), 09.36
Mindenféleképpen, ahogyan előttem is írták, sok kicsi tábla, tehát törekedjünk a harmadik normálfára, nem véletlenül találták ki nálunk jóval okosabb szakértők, később kellemesen meg fogja magát bosszulni. A lekérdezést pedig indexekkel, illetve eredményhalmaz gyorstárazással lehet majd gyorsítani.

--
slink
http://20y.hu/
4

indexelés

monghuz · 2005. Jún. 5. (V), 15.03
Szavasztok!

Nekem az indexeléssel kapcsolatban lenne kérdésem...
Ha van egy központi "users" tábla amiben többek közt szerepel szerepel város, kerület és csapat mező és van külön város,kerület,csapat tábla is melyekben a lehetséges adatokat és egy auto_incrementes id-t tárolok.
a kérdésem az lenne hogy hogyan kell megadni a lekérdezést hogy a szöveges adatokat kapjam vissza, úgy hogy a useres táblában a fent említett mezőkben csak id-ket tárolok.. (a users táblában a többi mező text típusú és azoknak a tartalmára is szükségem lenne..)
A példa kicsit konkrétabban:

users tábla:
- user_id /smallint , auto_inc , kulcs
- nev /text
- nick /text
- varos_id /smallint
- kerulet_id /smallint
- csapat_id /smallint

varos tábla (kerület és csapat tábla hasonlóképpen)
- varos_id /smallint , auto_inc , kulcs
- varos /text

jah és még valami írtad hogy az eredményhalmaz gyorstárazzásával lehet gyorsítani a lekérdezést, ez mit takar? SESSIONN vagy valmi tök más..

elöre is köszi a helpet ..
5

LEFT JOIN

Anonymous · 2005. Jún. 5. (V), 15.15
Két tábla összekapcsolása:
SELECT u.nev, v.varos FROM users u LEFT JOIN varos v USING(varos_id);


Gyulus
6

join muvelettel

Off- · 2005. Jún. 5. (V), 15.18
join muvelettel

SELECT users.nev, users.nick, varos.nev, kerulet.nev, csapat.nev
FROM users, varos, kerulet, csapat
WHERE users.varos_id = varos.varos_id AND
users.csapat_id = csapat.csapat_id AND
users.kerulet_id = kerulet.kerulet_id;
7

JOIN, AdoDB

Török Gábor · 2005. Jún. 5. (V), 15.56
Több táblából, ahogy előttem is írták, valóban kapcsolás segítségével nyerhetsz ki adatot, nézd meg az általad használt megvalósítás kézikönyvét, hogy a gyártó milyen szintaktikával teszi lehetővé a kapcsolt lekérdezést.

Eredményhalmaz gyorstárazására számos lehetőség van, én többnyire az AdoDB beépített lehetőségét szoktam javasolni, de itt is van egy életképes megoldás.

--
slink
http://20y.hu/
8

köszi

monghuz · 2005. Jún. 5. (V), 16.43
Most már értem a dörgést, köszi.. már csak egy kérdésem lenne .. ketten két féle megoldást írtatok, melyik a jobb? ránézésre a rövidebb, de kiv. vagyok hogy ti mint mondtok..

hali
9

A LEFT JOIN mondjuk

kris7topher · 2005. Jún. 5. (V), 16.50
A LEFT JOIN mondjuk elegánsabb... szvsz
10

szvsz

bbalint · 2005. Jún. 5. (V), 19.05
elvileg csak a táblák felsorolása is elég, mer' olyankor az adatbáziskezelő "kitalál valamit" hogy s mint kéne a táblákat összekapcsolni, viszont a JOIN-ok és a "kapcsolódási" feltételek kiírásával biztos úgy kapcsolja össze őket.

aszem, legalábbis ennyi amire a PostgreSQL doksiból most így emlékszem.

bbalint
11

a join megoldással az userek

Off- · 2005. Jún. 5. (V), 19.14
a join megoldással az userek tabla minden sorat kiirja egyszer. ha csak felsoroljuk a tablakat akkor minden tabla minden sorát osszeveti az osszes tábla osszes sorával. őő asszem :)

számokkal: ha userek tablában van 200 sor, varos ablaban 30, korzet tablaban 20 és csapat tablaban 40, akkor joinnal 200 rekor kerul listázásra, ha csak felsoroljuk akkor 200*30*20*40 sor..
12

a kevesebb jobb :)

monghuz · 2005. Jún. 5. (V), 23.48
már azt hittem hogy megértettem, de aztán megtaláltam ezt a mysql.org-on és bekavart...

mysql> SELECT * FROM table1 LEFT JOIN table2 USING (id);
mysql> SELECT * FROM table1 LEFT JOIN table2 ON table1.id=table2.id
    ->          LEFT JOIN table3 ON table2.id=table3.id;
a fenti (2.) pl alapján a table1-hoz kapcsolja a table2-t az table1 és 2 idmezőin keresztül és a table2, table3-at az 2es és 3as tábla idjével..
ergo megegyezik mind három tábla id-je?
vagy mégsem?

viszont az én esetemben a users tábla egy amolyan központi tábla.. annál is igy kell sorba rakosgatni?
vagyis =>

SELECT u.nev, v.varos, k.kerulet, cs.csapat FROM
users u LEFT JOIN varos v USING(varos_id) 
AND users u LEFT JOIN kerulet k USING(kerulet_id) 
AND users u LEFT JOIN csapat cs USING(csapat_id);
ez igy jó? jah és még valami ha már egyszer a useers-t u -ként értelmezem, akkor a többi left join nál "users u" helyett nem elég csak u-t írnom??

bocsi hogy ennyit szenvedek de valahol el kell kezdenem..
bye Tomi
13

Pontosítás

Balogh Tibor · 2005. Jún. 6. (H), 08.49
Elöször is: Az első lekérdezés főleg azért rövidebb, mert nem tartalmazza az általad megadott összes táblát.
A táblakapcsolatokat kétféle módon lehet létrehozni, vagy JOIN művelettel a FROM záradékban, vagy felsorolod a táblákat és a WHERE záradékban adod meg a kapcsolódási feltételeket. Ez az utóbbi megfelel a INNER JOIN műveletnek, ha INNER JOIN kapcsolatot akarsz alkalmazni, használhatod az INNER JOIN utasítást vagy a kapcsolódási feltételeket megadhatod a WHERE záradékban.

SELECT * FROM tabla1, table2 WHERE table1.mezo1 = table2.mezo1;
  ==
SELECT * FROM tabla1 INNER JOIN table2 ON table1.mezo1 = table2.mezo1;
Egy megjegyzés: ha a mezőknél a text a TEXT tipust jelöli pl. a névnél, akkor gyorsan cseréld le CHAR vagy VARCHAR tipusra!

Egyébként a témaindító kérdésre nem lehet egyértelmű válaszolni, mert nem tartalmazza a kérdés, hogy milyen adatokat akar összevonni vagy külön tárolni.
Ezért lehet, hogy azt kéne ajánlani, hogy tárolja egyben, de lehet, hogy azt, hogy bontsa szét több táblára az adatokat. De nem tudjuk, hogy mit, csak azt tudjuk, hogy fórumadatokról van szó. Egy fórumnál lehetnek különböző fórumtipusok, a fórumtipusokon belül különböző témák, majd hozzászólások, vannak regisztrált felhasználók, stb. Melyik tábla adatait akarja kettébontani?
14

ahol a part szakad :)

monghuz · 2005. Jún. 6. (H), 17.32
a fö gondom az hogy amit ti irtatok már többedik alkalommal, ott két táblát kapcsoltok össze amit értek is, csak az én esetemben lenne ugyebár a users , mint amolyna központi tábla, amely bizonyos mezőihez (hely_id , csapat_id) szeretnék fenti példámban 3 másikat kapcsolni ...

viszont a ti javaslataitok alapján... én valahogy így kapcsolnám össze a dolgokat.. (ami szerintem nem jó..)

SELECT * FROM tabla1 INNER JOIN table2 INNER JOIN table3 INNER JOIN table4 ON table1.mezo1 = table2.mezo1, table1.mezo2 = table2.mezo1.... stb;

ez "ha" müködne akkor gondolom hogy az 1es táblához a kettest és a ketteshez a hármast a hármashoz meg a négyest kapcsolná.. ellenben azzal ami nekem kell (1 táblához kapcsolok 3 másikat)

remélem értitek, és javítsatok ki ha rosszúl gondolom, de nekem nem következik 2 tábla összekapcsolásából hogy megtudom csinálni ezt 4 esetében is...
mégegyszer bots ha sokat értetlenkedek de minden mysql-es manualban csak 2 táblát kapcsolnak össze viszont inner join -nál olvastam hogy 50 valahányat lehet elméletben összekapcsolni...

nah várom a reakciókat .. bye Tomi
15

left join

VBala · 2005. Jún. 6. (H), 18.34
SELECT * FROM tabla1 LEFT JOIN tabla2 ON tabla2.mezo1=tabla1.mezo1 LEFT JOIN tabla3 ON tabla3.mezo1=tabla1.mezo1 WHERE...stb
Tehát nem "felfűzésként" működik, hanem amit hozzácsatoltál, az bekerül az közösbe, és onnan bármelyik tábla bármelyik mezőjéhez csatolhatod a következőt.
16

THX

monghuz · 2005. Jún. 6. (H), 21.42
köszi szépen holnap ki is próbálom (az érettségi után :-/ )

bye Tomi
17

left join

Balogh Tibor · 2005. Jún. 6. (H), 22.36
Már Béla leírta a selectet, de egy kis kiegészítés, nálad ebben az esetben a tabla1 a users táblának felel meg. Ha összekapcsolsz két táblát, az olyan mintha egy új táblát hoztál volna létre a kettőből. Egy javaslat: ne keverd az angol és magyar kifejezéseket a tábla és mezőnevekben. A táblaneveknél nem a többes hanem az egyes számot szokás használni. De semmi esetre sem azt, hogy hol angol, hol magyar; hol egyes, hogy többes szám szerepel.