Jag tänkte smälla ihop en "jag gillar" funktion, typ facebook, mot ett antal moduler i min databas. Modulerna är ex. artiklar, nyheter, produkter i webbutik m.fl.
Fråga:
Är det helt idiotiskt att ha en gemensam tabell för detta ändamål?
Tabellen skulle kunna se ut:
LikeID int primary key
Module int ex. 1=artikel, 2=nyhet, 3=produkt
RelatedID int en typ av foreign key mot övriga tabeller
IP varchar(20) användarens ip nummer
UserAgent varchar(MAX) användarens useragent
Sen om man har en viss artikel så hämtar man med:
Select * from LikeTable Where Module = 1 And RelatedID = 123
Men på detta sätt tappar man helt relationen i databasen mellan tabellerna eftersom RelatedID går mot alla tabellerna.
Fördelen är ju om man har 30 moduler man vill ha funktionaliteten på så slipper man skapa 30 "I like"-tabeller.
Om du har 30 olika tabeller modultabeller så är det väl ingen större förlust att ha 30 like-tabeller?
Ett tips: Kräv att användaren är inloggad (och spara använndar-ID't). Annars är det nästan för inbjudande enkelt att peppra en produkt med "likes" frän olika proxy-servrar. Skilj åtminstone på inloggade och inte inloggade röster.
Skippa ev. user-agent för att spara plats.
Du kan spara rösterna som du har föreslagit, men skapa även en kolumn för antalet röster för snabb åtkomst. Vid behov, när någon har lagt till en ny röst, kör typ:
UPDATE modul m SET likes = COUNT(l.LikeID)
LEFT JOIN likes l ON l.RelatedID = m.modulid
WHERE m.modulid = $id