ugrás a tartalomhoz

Egyszerű fórum DB tervezés – optimalizáció

gjozsi · 2009. Jún. 2. (K), 18.50
Sziasztok!

Szeretnék optimalizációs tanácsokat kérni, egy egyszerűbb fórum megtervezésével kapcsolatban. Ez még csak egy vázlat, scratchből írtam s kíváncsi lennék más megoldásokra:



Úgy működik, hogy a MainTopics és a SubTopics gyakorlatilag csak címeket tárol (meg relációkat egymásra). A Main és Sub topicokat majd egy főoldalra jelzem ki, felsorolva a Main topicokat és azokon belül kicsit beljebb kezdve a subokat. Ezekbe a Subokba tudnak majd a felhasználók vinni saját topikokat (az első kettőt csak admin), erre utal a ForumUserTopics tábla. A ForumMessages meg tartalmazza a hozzászólásokat, s hogy ki melyik UserTopicban van (mivel csak a userek által létrehozott témán belül lehet csak hsz., feljebb csak a témákon lehet navigálni), ha topic indító hsz. akkor a TopicStarter 'yes' (1), ha az üzenet válasz egy másikra akkor a megválaszolt hsz. idja van az AnswerToMessageID-ban.

Optimalizációs kérdés:

A ForumUserTopics és ForumMessages tábla akár többtízezer sorokat is tartalmazhat (főleg az utóbbi), így nem tudom/még nem tapasztaltam, mennyire fog ez belassulni az idő múlásával. Hogy lehetne okosabban megoldani? (Vagy jó ez így, csak indexelni kell okosan?)

Alternatívaként arra gondoltam hogy UserTopiconként új táblákat létrehozni (benne a message-ekkel), dehát akkormeg baromi sok tábla lesz (legyen csak 100 topik nem hogy 1000). Szóval lehet hogy ez tévút.

A segítségeket, ötleteket előre is köszönöm!
 
1

+1

Tanul0 · 2009. Jún. 3. (Sze), 12.32
Nálam is ugyan ez a felépítés, kivéve egy dolgot, a ForumUserTopics-ba még én beletettem a MainTopicID-t , ezzel egyszerűsítve a main fórumoknál az összes hozzászólások számának kiratását.

És én még csinálnék egy ForumModerators táblát:
ModeratorID - mivel egy usernek több alfórumban is lehet más szinteken joga
UserID - a user
MainTopicsID - Ha itt van akkor az az id ahol van, ha nincs akkor 0
SubTopicsID - Ha itt van akkor az az id ahol van, ha nincs akkor 0
ForumUserTopicsId - Ha itt van akkor az az id ahol van, ha nincs akkor 0
2

jó ötlet!...

gjozsi · 2009. Jún. 3. (Sze), 13.18
Ah, köszönöm az ötletet!

A moderátor tényleg valahogy kimaradt. Mondjuk én ezt több-a-többhöz kapcsolatba vízinálom és csak a subtopikokhoz fogom kötni, mivel MainTopicból relatíve kevés lesz (2-3), a SubTopicból több, a UserTopicsból meg nagyon sok tehát ahhoz sincs értelme adogatni, így maradt hogy csak SubTopicokra meghatározhatóak a moderátorok mert abból ilyen 5-6 db. lesz / maintopic.



A MainTopicok csak abszolút címke jellegűek lesznek (<h1>), csak a SubTopicokba lesz kiírva már az összes hozzászólás, utolsó hozzászóló és hasonlók... szóval azt nem tettem be, de abszolút jó ötlet lenne más felépítésnél, köszönöm!

Viszont a kérdés kérdés maradt. Az hogy 1 db tábla van az összes hozzászólásra, ami idő elteltével lehet 20.000 de 200.000 is, de akár még több, ezzel nincsenek teljesítmény beli problémák?

Mindenesetre köszönöm a segítséget, megnyugtató h. jóra gondoltam, erre még jelezz majd vissza ha kérhetem :-)

u.i.: A ModeratorsInSubTopics táblában a SubTopicId valójában FK1 csak bénáztam Visioval egyet :-)
3

szerintem minden más fórumban

Tanul0 · 2009. Jún. 3. (Sze), 13.34
szerintem minden más fórumban 1 tábla van a hozzászólásokra, de lapozással szerintem nem gond, ha 200.000 van laponként 50-et iratsz ki és kész
4

Elkezdtem írni..

gjozsi · 2009. Jún. 10. (Sze), 13.17
Nos, elkezdtem megvalósítani a fórumot. A lapozásnál (ForumUserTopics és ForumMessages-re) kissé elakadtam.

Vegyük a ForumUserTopics táblát:

20 soronként szeretném laponzi az adatokat.

A querystring így nézne ki pl.: foo.aspx?subtopic=7?maxID=20

A maxID azt jelöli hogy melyik UserTopicID utáni 20 sort kérem le. Első 20 sor lejövetelénél pl. ?maxID=0 vagy nincs is, csak annyi hogy ?subtopic=7 (mert ekkor nyílván az első oldalt szeretnék viszont látni). Na így lekérek 20 sort. Ebből a 20 sorból ki tudom nyerni a maximum UserTopicID-t, mivel lekérdeztem. Az oldalgombok generálásánál így azt tudom mondani hogy második oldalra úgy ugrunk hogy ?maxID=x (ahol x a jelenleg lekért 20 sorból a legnagyobb ID)

Na de mivan ha az elsőről a 3. oldalra akarok ugrani?

Nem mondhatom azt hogy úgy állítom be a linkjét a 3. oldal gombjának, hogy ?maxID=x+20 mert a UserTopicID-k nem 1-esével nőnek, hanem randomra egy SubTopicon belül. Nézzük meg a ForumUserTopics táblát:



Kérdezzük le azokat amik az 1-es számú SubTopicban vannak



A UserTopicID-k így jönnek: 1, 2, 8, 9, 10, 11, 12 (tehát a különbség teljesen random), így nem tudok következtetést levonni hogy hogy lehetne a 2. oldalszámnál további linkeket megállapítani.

Ebben szeretnék segítséget kérni, hogy egyáltalán jó úton indulok e a megvalósításnak, vagy van valami egyszerűbb módja a lapozás kivitelezésének?

(egyetlen bruteforce módszer jutott eszembe, hogy pl. az első oldal lejöttekkor 20anként végigugrálok a sorokon [egyáltalán van ilyen SQL query?], s eltárolom a megfelelő ID-kat.. dehát ez nagyon bruteforce és lassú, pl egy 100.000.-es táblánál)
5

function lap_link($link,

Tanul0 · 2009. Jún. 10. (Sze), 13.57

$szamol = mysql_num_rows(lekerdez("SELECT hirID FROM hirek"));
		$lapok=1;
		$lap = $_GET['lap'];
			if(!isset($lap)) $lap = 1;
					////MAXIMUM PER OLDAL//////
					$max=3;
					//////////////////////////////
			for ($n=$max; $n<=$szamol; $n+=$max) 
			{
					if($szamol>$n) $lapok++;
			}
		
					if($lapok>1) $lap_link = lap_link("index.php?oldal=hirek", $lap, $lapok);
		
			if ($lap == "1") 
				{
					$kiir = lekerdez("SELECT * FROM hirek ORDER BY hirID DESC LIMIT 0,$max");
					$n=1;
				}
			else 
				{
					$start=$lap*$max-$max;
					$kiir = lekerdez("SELECT * FROM hirek ORDER BY hirID DESC LIMIT $start,$max");
					$n = $szamol-($lap-1)*$max;
				}	




function lap_link($link, $lap, $lapok) {
	$lap_link = '';
	if($lap!=1) $lap_link .= "&nbsp;<a href=\"$link&lap=1\">&laquo;</a>&nbsp;<a href=\"$link&lap=".($lap-1)."\">‹</a>";
	if($lap>=6) $lap_link .= "&nbsp;<a href=\"$link&lap=".($lap-5)."\">...</a>";
	if($lap+4>=$lapok) $lapx=$lapok;
	else $lapx=$lap+4;
	for($i=$lap-4 ; $i<=$lapx ; $i++) { 	
		if($i<=0) $i=1;
		if($i==$lap) $lap_link .= "&nbsp;<b><u>$i</u></b>";
		else $lap_link .= "&nbsp;<a href=\"$link&lap=$i\">$i</a>";
	}
	if(($lapok-$lap)>=5) $lap_link .= "&nbsp;<a href=\"$link&lap=".($lap+5)."\">...</a>";
	if($lap!=$lapok) $lap_link .= "&nbsp;<a href=\"$link&lap=".($lap+1)."\">›</a>&nbsp;<a href=\"$link&lap=".$lapok."\">&raquo;</a>";
	$lap_link .= "";

	return $lap_link;
}

Nálam php-ban így néz ki a laplink generálás, sajnos az asp-hez nem értek, de talán az elvi működése segíthet