Vinnaren i pepparkakshustävlingen!
2016-10-10, 08:54
  #1
Medlem
Har en tabell poster med PK PostId, en tabell med användare som har PK UserID och däremellan har jag en ”associationstabell” där det skapas en ny rad med PostID och UserId när en ny post skapas (för att jag ska kunna hitta en användares alla poster etc). Skulle väl ifs kunna lösas med att jag har UserID i Post-tabellen efersom det är en en-till-många relation.

Nu vill jag införa en enkel röstning likt stackoverflow med en siffra som indikerar totalt antal röster och användare kan rösta en gång på varje post genom att klicka på pil upp eller ner för varje post. Tänker mig då att en användare då med sin röst aningen ger -1 (röstar ner), 0 (ingen röst), +1 röstar upp).

Tänker då att man i min "associationstabell" lägger till en kolumn "Votes" som innehåller just -1, 0 eller +1 för som läggs till när en användare röstar. På så sätt kan jag lätt få fram alla röster för en post, alla röster för en användare etc.

Typ såhär
Kod:
+--------+--------+-------+
| PostID | UserId | Votes |
+--------+--------+-------+
| 1      | 123    | +1    |
+--------+--------+-------+
| 2      | 123    | 0     |
+--------+--------+-------+
| 1      | 456    | +1    |
+--------+--------+-------+

Där man kan få fram att två användar röstat på post med Id 1 och då har den med andra ord två poäng.

Fungera detta? Bättre alternativ?
Citera
2016-10-10, 09:29
  #2
Moderator
Protons avatar
Citat:
Ursprungligen postat av _x3m_
Har en tabell poster med PK PostId, en tabell med användare som har PK UserID och däremellan har jag en ”associationstabell” där det skapas en ny rad med PostID och UserId när en ny post skapas (för att jag ska kunna hitta en användares alla poster etc). Skulle väl ifs kunna lösas med att jag har UserID i Post-tabellen efersom det är en en-till-många relation.
Det där kommer bli skitkonstigt, hur har du då tänkt att flera användare ska kunna rösta på en post? Ska du skapa en ny postrad varje gång en användare röstar, eller har du tänkt att göra en sådan WTF som att ha flera användare i en kolumn kommaseparerad?

Tycker att du i sammanhanget hade rätt första gången, dvs att införa en kopplingstabell med användarid och postid samt en vote.

Extrapoäng utdelas för den designen om du gör en primärnyckel av attributen användarid och postid tillsammans i den tabellen, då kommer en användare endast kunna lägga en vote per post, dvs din databasdesign kommer förhindra fusk med att en användare röstar fler gånger per post.
Citera
2016-10-10, 09:43
  #3
Medlem
Citat:
Ursprungligen postat av Proton
Det där kommer bli skitkonstigt, hur har du då tänkt att flera användare ska kunna rösta på en post? Ska du skapa en ny postrad varje gång en användare röstar, eller har du tänkt att göra en sådan WTF som att ha flera användare i en kolumn kommaseparerad?

Tycker att du i sammanhanget hade rätt första gången, dvs att införa en kopplingstabell med användarid och postid samt en vote.

Extrapoäng utdelas för den designen om du gör en primärnyckel av attributen användarid och postid tillsammans i den tabellen, då kommer en användare endast kunna lägga en vote per post, dvs din databasdesign kommer förhindra fusk med att en användare röstar fler gånger per post.

Ursäkta men hänger inte med riktigt på vad du tycker är konstigt och bra ;-)
Jag har en många-till-många relation mellan Posts och Users. När en användare röstar så lägger jag in en ny rad i tabellen UserPosts som har UserId, PostId, Vote

Sen tycker du det är konstigt att man i den tabellen lägger en ny rad när användare skapar en ny post (för att ex ha koll på en användares alla poster, radera och redigera poster)? Ska jag utöver UserPosts-tabellen med votes skapa UserId i posts-tabellen som är FK för att ha koll på en användars alla poster när en användare skapar en ny post?
Citera
2016-10-10, 09:44
  #4
Medlem
Använd din relationstabell som du beskrivit, men för att slippa mer än ett villkor måste du skapa ett dummy ID som skapas för varje unik kombination av PostId och UserId, som du vet är ett unikt Id just unikt och förbjuder dubletter, dvs du kommer aldrig att få en rad där en user att har två samma poster(Id), (dvs en user kan bara rösta en gång)

Hoppas jag fattat din fråga rätt, med min lösning blir det fyra(4) kolumner i stället för dina tre(3). Kombinationen av de främmande nycklarna UserId och PostId skapar NnId (dummyn)
Citera
2016-10-10, 09:50
  #5
Moderator
Protons avatar
Citat:
Ursprungligen postat av _x3m_
Ursäkta men hänger inte med riktigt på vad du tycker är konstigt och bra ;-)
Jag har en många-till-många relation mellan Posts och Users. När en användare röstar så lägger jag in en ny rad i tabellen UserPosts som har UserId, PostId, Vote

Sen tycker du det är konstigt att man i den tabellen lägger en ny rad när användare skapar en ny post (för att ex ha koll på en användares alla poster, radera och redigera poster)? Ska jag utöver UserPosts-tabellen med votes skapa UserId i posts-tabellen som är FK för att ha koll på en användars alla poster när en användare skapar en ny post?
Nej, jag uppfattade det så at du ville ha ett userid i post-tabellen och det skulle bli skitkonstigt.

Det du ska ha, som du redan kommit fram till, är en kopplingstabell innehållandes postid, userid och en vote, med userid i kombination med postid som primärnyckel.

Har du denna kombo som primärnyckel behöver du inte nåt mer i den tabellen.
Citera
2016-10-10, 09:59
  #6
Medlem
Citat:
Ursprungligen postat av Proton
Nej, jag uppfattade det så at du ville ha ett userid i post-tabellen och det skulle bli skitkonstigt.

Det du ska ha, som du redan kommit fram till, är en kopplingstabell innehållandes postid, userid och en vote, med userid i kombination med postid som primärnyckel.

Har du denna kombo som primärnyckel behöver du inte nåt mer i den tabellen.

Ok, så då är jag på rätt spår? Dvs såhär kommer scenariot se ut. Har en många-till-många relation mellan Post och Users som ger en tabell med UserId, PostsId och Votes

När användaren skapar en ny post läggs följande till i UserPost-tabellen (för att hålla koll på användarens inlägg).
Kod:
UserId PostId Vote
123    1    null

När sedan en annan användare (456) väljer att rösta (+1) på den posten ser det ut såhär.
Kod:
UserId PostId Vote
123    1    null
456    1    1
Citera
2016-10-10, 11:21
  #7
Moderator
Protons avatar
Citat:
Ursprungligen postat av _x3m_
Ok, så då är jag på rätt spår? Dvs såhär kommer scenariot se ut. Har en många-till-många relation mellan Post och Users som ger en tabell med UserId, PostsId och Votes

När användaren skapar en ny post läggs följande till i UserPost-tabellen (för att hålla koll på användarens inlägg).
Kod:
UserId PostId Vote
123    1    null

När sedan en annan användare (456) väljer att rösta (+1) på den posten ser det ut såhär.
Kod:
UserId PostId Vote
123    1    null
456    1    1
Du skulle ju kunna ha en "author" i post-tabellen dock så slipper du nullvärden i din userpost, dessutom tycker jag du ska använda den tabellen till att hålla rätt på röster och inte den som postade nåt från början.

Btw så borde du kanske kalla din userpost-tabell för userpostvotes eller kanske enbart votes för att ge en mer rättvisande bild av vad tabellen innehåller?
Citera
2016-10-10, 12:41
  #8
Medlem
Citat:
Ursprungligen postat av Proton
Du skulle ju kunna ha en "author" i post-tabellen dock så slipper du nullvärden i din userpost, dessutom tycker jag du ska använda den tabellen till att hålla rätt på röster och inte den som postade nåt från början.

Btw så borde du kanske kalla din userpost-tabell för userpostvotes eller kanske enbart votes för att ge en mer rättvisande bild av vad tabellen innehåller?

och vad ska author i post-tabellen innehålla? UserId? Dvs

User.tbl
UserId
Username

Post.tbl
PostId
Message
Author (FK UserId)

Vote.tbl
UserId
PostId
Citera
2016-10-10, 13:12
  #9
Moderator
Protons avatar
Citat:
Ursprungligen postat av _x3m_
och vad ska author i post-tabellen innehålla? UserId? Dvs

User.tbl
UserId
Username

Post.tbl
PostId
Message
Author (FK UserId)

Vote.tbl
UserId
PostId
Ja det där ser ju helt korrekt ut tycker jag och det var precis så jag menade.

Btw, om du nu har tänkt att hitta på nåt i stil med stackoverflow, då kanske du ska ha postdatum där nånstans med(dvs när posten skrevs) samt nån tabell för att hålla eventuella kommentarer eller svar?
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback