PM-system ( PHP / Ajax / MySQL )

PM-system ( PHP / Ajax / MySQL )

Hallå där du som orkar läsa!
Jag håller på att bygga det nya Facebook!

Skämt åsido...
Har byggt ett litet community med en väldigt simpel och bristfällig PM-funktion där man kan skicka PM till en annan user genom att gå in på dennes profil och skicka via formuläret där.
Det jobbiga är ju att när man går in i sin inkorg och läser meddelandet så kan man liksom inte svara där direkt, utan man får gå till medlemmens profil igen och fylla i formuläret.
Lagom användarvänligt med andra ord =D

Så jag har funderat (och sökt runt lite på nätet) på hur jag skapar en konversation, så att man kan ha allt samlat helt enkelt.
Har provat att hämta datan med Ajax/jQuery och det blir ju real-time och man slipper refresha osv men jag kan fan inte komma på hur jag ska "starta" en konversation mellan två specifika users och ha alla meddelanden samlade efter varandra, som en chatt i Messenger alltså.
Detta är säkert jättesimpelt att fixa för den som är lite mer erfaren i SQL/Programmering överlag men jag får inte till logiken i skallen än.
Som det är nu så är inte user-tabellen relaterad till message-tabellen i alla fall.

Skrivet av ChrisGBG:

Hallå där du som orkar läsa!
Jag håller på att bygga det nya Facebook!

Skämt åsido...
Har byggt ett litet community med en väldigt simpel och bristfällig PM-funktion där man kan skicka PM till en annan user genom att gå in på dennes profil och skicka via formuläret där.
Det jobbiga är ju att när man går in i sin inkorg och läser meddelandet så kan man liksom inte svara där direkt, utan man får gå till medlemmens profil igen och fylla i formuläret.
Lagom användarvänligt med andra ord =D

Så jag har funderat (och sökt runt lite på nätet) på hur jag skapar en konversation, så att man kan ha allt samlat helt enkelt.
Har provat att hämta datan med Ajax/jQuery och det blir ju real-time och man slipper refresha osv men jag kan fan inte komma på hur jag ska "starta" en konversation mellan två specifika users och ha alla meddelanden samlade efter varandra, som en chatt i Messenger alltså.
Detta är säkert jättesimpelt att fixa för den som är lite mer erfaren i SQL/Programmering överlag men jag får inte till logiken i skallen än.
Som det är nu så är inte user-tabellen relaterad till message-tabellen i alla fall.

Tidsstämpel och relationer låter som något användbart i det här fallet. Typ spara ett user_id på meddelanden men även tidsstämpel så du kan sortera arrayen efter tid.

Du skulle kunna ha message-tabellen på följande vis:
id, parent_id, from_user_id, to_user_id, message, timestamp

Sätt parent_id till 0 om det är en ny konversation. Om det istället är ett svar på ett tidigare meddelande så sätter du parent_id till meddelandets ID. from_user_id och to_user_id är ganska självbeskrivande (går säkert att hitta bättre namn på dom), och de kan skifta mellan meddelandena i konversationen. parent_id kanske kan döpas till reply_to_id om det är lättare att förstå vad den hänvisar till.

Om du vill kunna skala dina meddelanden så gör följande:

"messages" table: standard grejer, id/message/user_id/timestamp
"conversations" table: id/timestamp
"conversation_user" table, id/conversation_id/user_id/timestamp

Vill du skala det till att fungera som t.ex. slack lägger du till en ny tabell kallad t.ex. threads som tillhör conversations. Svarar en användare på ett specifikt meddelande i konversationen så skapas en tråd som tillhör konversationen, och alla meddelanden som svarar på det meddelandet hamnar i tråden istället. På det sättet får du mer en

- Meddelande 1 - Meddelande 2 - Meddelande 3, svar till meddelande 2 - Meddelande 4, svar till tråden - Meddelande 5 (svarade inte på tråden) etc

Göra på det här sättet gör det också enkelt att stöda ett oändligt antal användare i samma konversation (kan vara bra att kunna t.ex. bjuda in folk till en konversation osv)

Se bara till att sortera enligt timestamps så kommer datan när du ritar ut den fungera perfekt. Upp till dig på vilket sätt du vill stöda trådar (om du ens vill det), finns många sätt att göra det på.