M@rtinMedlem sedan dec. 19992 085 inlägg Med alla bloggar och sådant är det ju vanligt att man använder sig av taggar för att kategorisera sitt inlägg. Jag undrar om det är någon som vet hur man smartast löser databasstrukturen för det?
Förr har jag gjort såhär:
tbl_posts
id | content | pubdate
tbl_tags
tag | nr_of_posts
tbl_posttagrel
post_id | tag
Det fungerar bra, anledningen till att jag skulle vilja ha en annan lösning är att jag skulle vilja få ut vilka taggar som använts mest t.ex. den senaste veckan och det är i princip omöjligt med den strukturen.
Någon som har någon smart struktur på lager?
M@rtinMedlem sedan dec. 19992 085 inlägg Okej jag har funderat en del själv och kommit på en lösning som jag tror borde fungera bra:
tbl_posts
id | content | pubdate | tags
tbl_tags
tag | nr_of_posts
tbl_recenttags
tag | post_id | post_time
När jag postar ett nytt inlägg lägger jag ihop alla taggar i en lång textsträng separerade med mellanslag. Ex: " nyhet politik dn media tv "
Jag lägger även till den i tbl_recenttags med datum för inlägget. Jag raderar även alla tupler i denna tabell som är äldre än ett visst antal dagar som jag anser är "recent".
Jag lägger även till taggen i tbl_tags eller ökar nr_of_posts om taggen redan finns. Denna tabell är egentligen inte nödvändig men om jag någon gång skulle vilja använda den så är det bättre att den finns än att jag då ska föröka summera alla taggar i efterhand.
Nu borde jag kunna få fram de populära taggarna genom att köra en count(*) med GROUP BY tag i tbl_recenttags tabellen. Jag borde även kunna hitta inlägg som har en viss tag genom "SELECT * FROM tbl_posts WHERE tags LIKE '% nyhet %'".
Någon som har några invändningar mot denna struktur? Finns det någon tag-funktion som jag kanske inte kommer kunna göra?
dAEkMedlem sedan feb. 20041 816 inlägg Jag hade nog gjort som så här:
tbl_post
id | content | pubdate | owner
tbl_tag
id | tagtext | idparent
tbl_post_tags
idpost | idtag
Med designen ovan finns det möjlighet att sätta flera taggar på en post och man kan skapa sig en tag-hierarki om man vill.
Lösningen med tabellen tbl_tags du gjort gillar jag inte speciellt mycket. Jag tycker att tabellen är onödig plus att du tvingas köra en extra update när du skapar eller tar bort en post vilket kan påverka prestandan negativt. Såvitt jag vet är update, delete och inserts mer krävande än select-statements, om du skriver dem "rätt" vill säga.
Vad händer t.ex. om du går in och knackar SQL-kod utanför ditt gränssnitt och glömmer uppdatera tbl_posts-tabellen?
Näe jag hade slopat en sådan lösning, helt klart. :)
M@rtinMedlem sedan dec. 19992 085 inlägg Fast din lösning är ju ungefär som den jag hade från början, förutom hierarkin men jag tänkte inte ha någon hierarki. Det stora problemet är hur jag ska få fram t.ex. de populäraste taggarna denna vecka, hur skulle det göras med din lösning?
Ja tbl_tags slöar ned allt och krånglar till det och antagligen har jag ändå ingen nytta av den men jag tog med den för säkerhets skull så kan jag skippa den senare, men ni kan bortse från den.
dAEkMedlem sedan feb. 20041 816 inlägg Okaj, då ska vi se.
Det som visas är
- taggens namn
- taggens id
- hur många gånger den förekommer inom intervallet
Följande kod är testad i MySQL 5.
SELECT t.tagtext,
t.id,
COUNT(pt.idTag) as num
FROM tbl_tag t
LEFT JOIN tbl_post_tags pt ON
pt.idtag = t.id
JOIN tbl_post p ON
p.id = pt.idPost
WHERE p.datepublished > '2006-07-11 00:00:00' AND
p.datepublished < '2006-07-24 00:00:00'
GROUP BY pt.idTag
ORDER BY num DESC;
Det krävs att man skickar in parametervärden(för datumen) från sitt program eller vad det nu är som använder sig av databasen. Det går att komma runt det, tror jag, genom att använda de inbyggda funktionerna för datumhantering i MySQL. Det borde även ge en effekivare kod skulle jag tippa men jag kom på att kolla där lite sent. :(
Vilken databas använder du btw?
M@rtinMedlem sedan dec. 19992 085 inlägg Ah, ja det funkar ju såklart :) Jag är dålig på sånt där med JOIN och sånt.
Mysql använder jag.
Då löser jag det så, tack så mycket :)