Adatbázisban hogyan érdemesebb kialakítani a táblát?
A kommentek táblán tűnődöm.
id, cikk_id, user_id, szöveg, komment_id
komment_id - ha ez egy válasz egy másik kommentre, akkor a komment id-ja, ha NEM, akkor 0 legyen? vagy NULL?
Cikk kiiratáskor minden egyes kommenthez kell még egy query, hogy van-e erre válasz, ugye? akkor nem lenne jobb egy válasz oszlop is, ami számlálja?
(vagy ilyen mini-queryt olyan gyorsan csinál, hogy felesleges?)
Legyen NULL? ha szavazni kell.
Kellemesen bevezettél minket egy történet közepébe, előzmények és folytatás nélkül, pl. nem tudom, feltűnt-e neked, mennyire hiányzik egy alany az utolsó mondatból. És ez nem puszta nyelvtan.
Addig is, amíg összeszeded a gondolataidat, nézz utána az indexelésnek.
Köszi
(igen, van dátum is, csak most nem írtam ide, de azért köszi)
#1 az előtte lévő kérdés folytatása (igaz, a kérdőjel elé kellett volna írnom a zárójeles részt), a válasz számláló felesleges-e, mert ilyen kis lekérdezés olyan gyorsan lefut-e.
Így értettem, és meleg van most a nyelvtanhoz.
A phpmyAdmin nem csinál semmit, csak egy kezelőfelület. Ezek szerint egy mySQL adatbázisra gondoltál. (Ez volt az első hiányzó információ.)
A sebességnél három dolgot kell figyelembe venned:
- A lekérdezések sebessége megfelelő indexeléssel _lényegesen_ gyorsítható, ezért mondtam, hogy nézz utána.
- Ha webre programozol, a szűk keresztmetszet általában a megjelenítés sebessége, ami ennél gyorsabb, azzal sokat nem érdemes foglalkozni (ezért lehet interpretált scriptnyelveket használni a webprogramozásban).
- Ha felveszel plusz egy redundáns mezőt, akkor minden módosításkor két táblában kell egyidejűleg átírni, és lehet, hogy gyorsabb lesz a lekérdezés, de lassabb az új adat mentése és bonyolultabb a karbantartás. Alapszabály, hogy redundáns adatot csak akkor tárolunk, ha a feladat szempontjából lényeges sebességnövekedést lehet elérni vele, különben csak bajnak van.
Kommentek táblája:
comments:
comment_id | comment_owner | comment_title | comment_date | comment_text | comment_topic | comment_parent
<?php
$sql = 'SELECT * FROM adatbazisneve.comments WHERE comment_topic = '.$oldal_azonosíitoja;
$result = mysql_query($sql) or die(mysql_error());
while($row = mysql_fetch_array($result)){
echo $row['comment_id '];
echo $row['comment_owner '];
echo $row['comment_title '];
echo $row['comment_date '];
echo $row['comment_topic '];
echo $row['comment_parent'];
}
?>
Elvileg ennyi.
"Cikk kiiratáskor minden egyes kommenthez kell még egy query, hogy van-e erre válasz, ugye?"
Nem, ha rekurzív lekérdezést csinálsz.
Hát mySQL-ben sajnos b*szhatja a rekurzív query-ket. Bár pont a MySQL az eddigi pályafutásom során kimaradt az életemből - nem véletlenül, komolyabb DB-t sehol nem csinálnak mySQL-ben - , de némi guglizás árán annyi már kiderült, hogy ilyet nem tud. Az ORA, MS SQL, IDM DB2 pl. igen, de valszeg az nem opció a kérdezőnek.
Persze lehet függvényekkel szimulálni ugyanazt, mint az ORA, meg a többi, de valójában az is ugyanolyan lassú lesz.
Ráadásul komment törlése ugyanolyan szopás lesz, mert ha FK-t raksz rá, akkor minden választ is törölnöd kell majd előbb, mielőtt az ős-kommentet törlöd. Ez már funkcionalitás szempontjából is egy megszorító tényező, mert nem biztos, hogy kívánatos dolog az összes válasz törlése, csak azért, mert az a user, akinek válaszoltak, törölte a sajátját.
Valójában ahhoz, hogy egy cikk összes hozzászólását lekérdezd, elég a cikk-id alapján egy SELECT, aztán kód oldalon megcsinálod a hierarchiát, szóval akár müködhet jelen formájában is a dolog, csak hát képzeld el, hogy van 10000+ hozzászólás, abból összerakni a hierarchiát nem lesz gyors.
A kommentenként lekérdezni a rá érkezett összes választ a jelenlegi megoldással viszont lehetetlen, csak képzeld el, hogyan kérdeznéd le egy komment közvetlen leszármazottait:
egy sima LEFT JOIN önmagával.
Lekérdezni a komment hozzászólásait ÉS az azokra érkezetteket is:
már két LEFT JOIN, stbstb., erre ugye nem lehet általános megoldást írni.
Egy lehetséges és egyszerű megoldás a problémára a jelenlegi DB sémát megtartva:
A komment_id helyett egy id_path nevű string mező alkalmazása, amiben valamilyen nem numerikus jellel elválasztva sorolod fel az őselemek sorrendjét:
pl:
id,cikk_id,user_id, szöveg, id_path
1, 123, Béla, "Ez egy jó cikk", "1", -> Ő az ős-hozzászólás, saját magát teszed bele
2, 123, Józsi, "Szerintem sz*r" "1/2", -> Ő válaszolt Béla kommentjére
3, 123, Frankie, "Te vagy a sz*r" "1/2/3", -> Ő válaszolt Józsi kommentjére
4, 123, Jack, "Anyád a sz*r" "1/2/4", -> Ő is Béla kommentjére írt választ
Így a lekérdezés egyszerű, mert ha az összes kommentet látni akarod, ami Bélából indult ki,
akkor WHERE id_path LIKE '1/%'.
Ezt kényelmesen össze lehet kötni egy AJAX-os komment-betöltős megoldással, pl. alapból csak a hierarchia tetejét rakod ki, aztán ha egy-egy komment-et lenyit a user, akkor AJAX-al betöltöd a hozzá tartozó válaszokat egy LIKE-os lekérdezéssel, akár az egész, akár egy rész-hierarchiát.
Aztán van még rá jó pár módszer, hogyan lehet hierarchikus adatokat kezelni mySQL-ben, de nincs kedvem már többet gépelni :)
Nyolcas vagyok, bocsánat, mySQL az nem létezik a gondolatvilágomban sem. :D
Soha nem fogom megérteni, miért használja bárki, amikor ott a szintén ingyenes PostgreSQL, ami alkalmas professzionális használatra is (és lehet benne rekurzív lekérdezést csinálni ;) ).
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!