Kezdőoldal » Számítástechnika » Programozás » Adatbázisban hogyan érdemesebb...

Adatbázisban hogyan érdemesebb kialakítani a táblát?

Figyelt kérdés

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?)


2013. aug. 9. 20:43
 1/10 anonim ***** válasza:
30%

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.

2013. aug. 9. 20:57
Hasznos számodra ez a válasz?
 2/10 anonim ***** válasza:
100%
Jó, amit kitaláltál. Én még egy datum nevű datetime típusú oszlopot beleraknék és aszerint rendezném lekérdezéskor a hozzászólásokat. Kiíratásnál sokféleképpen lehet csinálni. A kérdés az, hogy Te hogy képzeled el, mert ezen múlik minden. Meg lehet például úgy is oldani, hogy minden kommenthez kiíratod a komment ID-jét. És ha az adott hozzászólás egy válasz valamire, akkor odaírod, hogy ez egy válasz a x. számú hozzászólásra, ami mondjuk lehet egy link, amire ha rákattintanak, akkor az oldalon belül odaugrik ahol az a hozzászólás van - ez ugyebár sima html kód és akkor már is nincs szükség a többszörös query-re. De lehet ezeregyféleképpen. Rajtad áll.
2013. aug. 9. 20:59
Hasznos számodra ez a válasz?
 3/10 A kérdező kommentje:

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.

2013. aug. 9. 21:55
 4/10 anonim ***** válasza:
A nyelvtanhoz sosincs meleg, ha értelmes kérdést akarsz feltenni. MI csinálja gyorsan? Hogy lehessen válaszolni rá, ha ezt nem árulod el?
2013. aug. 9. 22:16
Hasznos számodra ez a válasz?
 5/10 A kérdező kommentje:
phpMyAdmin
2013. aug. 9. 22:53
 6/10 anonim ***** válasza:
100%

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.

2013. aug. 10. 09:45
Hasznos számodra ez a válasz?
 7/10 anonim ***** válasza:
45%

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.

2013. aug. 10. 15:02
Hasznos számodra ez a válasz?
 8/10 anonim ***** válasza:

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

2013. aug. 11. 16:52
Hasznos számodra ez a válasz?
 9/10 anonim ***** válasza:

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 :)

2013. aug. 11. 21:28
Hasznos számodra ez a válasz?
 10/10 anonim ***** válasza:

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

2013. aug. 11. 21:43
Hasznos számodra ez a válasz?

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!