webForumDet fria alternativet

Tabellstruktur - PM-funktion

10 svar · 330 visningar · startad av Peeer

PeeerMedlem sedan mars 20025 907 inlägg
#1

Sitter här och klurar lite på hur man smartast bygger upp en PM-funktion. Följande funktioner har jag tänkt ska finnas med.

  • Ta emot PM (naturligtvis).
  • Skicka PM till annan medlem (ev. flera samtidigt). Man ska kunna läsa skickade PM (även om mottagaren raderat sin kopia).
  • Spåra PM (se när (om) meddelandet är läst, om inte så ska man kunna radera det).
  • Skapa olika mappar.
  • Radera/flytta runt meddelanden mellan olika mappar.

Frågan är hur man gör det hela bäst & effektivast. Ska man ha en tabell för skickade och en mapp för mottagna meddelanden? Ska varje meddelande ta två poster (en för mottagaren och en för avsändare), eller hur ser man till så att avsändarens skickade PM inte försvinner när mottagaren raderar sitt mottagna? Vilka fält ska/bör indexeras (vad innebär indexering?)?

Har tänkt ut följande struktur, men då har jag ingen lösning på hur man gör när mottagaren raderar sitt PM.

Tips?

t_user
*user_id - Användarens ID
*user_name - Användarens namn
...

t_pm
*pm_pmID - Meddelandets ID
*pm_senderID - Avsändarens ID
*pm_receiverID - Mottagarens ID
*pm_sendtime - Tidpunkt då meddelandet skickades
*pm_headline - Meddelandets rubrik
*pm_text - Själva meddelandet
*pm_read - Tidpunkt när meddelandet lästes första gången(oläst = null)
*pm_folderID - Vilken mapp meddelandet ligger i

t_pmfolders
*folders_folderID - Mappens ID
*folders_foldername - Mappens namn
*folders_ownedby - Mottagarens ID

DBMS: MySQL

K@llenMedlem sedan mars 20032 667 inlägg
PeeerMedlem sedan mars 20025 907 inlägg
#3

K@llen:
Har kollat lite på din struktur och förstår inte riktigt vad "pm_from_status" är till för. Meddelandet kan väl bara vara "skickat" eller? Hur kollar du om mottagaren har läst meddelandet (pm_to_status?)? Hur har du löst raderingsproblemet. När ex. avsändaren väljer att radera ett meddelande, görs då en koll på om mottagaren raderat sitt meddelande. Om så är fallet raderas meddelandet, annars får det vara kvar?

Varför två separata tabeller? Ser inget hinder för att kolumnerna i pm_mess skulle kunna ligga pm.

K@llenMedlem sedan mars 20032 667 inlägg
#4

Hej Peeer,

Två separata tabeller har jag på grund av att undvika dubbellagring. Låt oss antaga att jag skickar samma meddelande till 70 medlemmar, då sparar jag samma text på 70 ställen om det ligger i samma tabell, vilket är lite onödigt.

pm_from_status är till för vilken status meddelandet har hos avsändaren. Jag har 4 "nivåer"; läst, oläst, besvarat och vidaresänt. Medelmmen kan ju behöva vidaresända ett meddelande från sin skickatmapp.

När jag raderar mitt meddelade sätts pm_from_deleted till 1, dvs med en update. Först när både pm_from_deleted och pm_to_deleted har värdet 1 raderas meddelandet. (men meddelande med raderadstatus 1 visas inte för medlemmen) Alla meddelanden där både pm_from_deleted och pm_to_deleted har värdet 1 raderas (med ett cron-job) helt när så är fallet.

En annan lösning är att spara vars en post som raderas direkt av användaren.

PeeerMedlem sedan mars 20025 907 inlägg
#5

Jahaja, det verkar ju onekligen ganska logiskt uppbyggt. Får nog bli någon liknande struktur min variant sedan.
Tackar & bockar.

PeeerMedlem sedan mars 20025 907 inlägg
#6

K@llen:
Har tittat lite mer på din struktur nu, och kommit fram till följande fråga. Hur binds tabellen pm_mess ihop med pm? Det finns ju ingen kolumn i pm som talar om vilket meddelande som hör dit. Lust att förklara? :)

K@llenMedlem sedan mars 20032 667 inlägg
#7

pm_id i meddelande-tabellen är relaterad till pm-tabellen genom pm_current_id. :)

PeeerMedlem sedan mars 20025 907 inlägg
#8

K@llen skrev:

pm_id i meddelande-tabellen är relaterad till pm-tabellen genom pm_current_id. :)

Nu gör sig okunskapen påmind. Hur menar du?

Om samma meddelande ska kunna skickas till flera samtidigt så måste man ju kunna ha samma pm_current_id på flera poster i pm (eller?). Det kan jag ju inte nu. Vill du förklara för en ovetande?

K@llenMedlem sedan mars 20032 667 inlägg
#9

Varför kan du inte det?

* Du lagrar vad du ska i meddelandetabellen.
* Hämtar ut det id du nyss lade in med insert_last_id() eller PHPs funktion till det samma.
* Lagrar aktuellt id för alla poster i pm-tabellen

Det du får göra om du vill ha många mottagare är att skippa deleted-kolumnerna, och istället lagra en post för varje mottagare i pm-tabellen.

PeeerMedlem sedan mars 20025 907 inlägg
#10

När jag försöker lagra en post med ett pm_current_id som redan finns i databasen får jag ett felmeddelande.

SQL-fråga :

INSERT INTO `pm` ( `pm_current_id` , `pm_from_uid` , `pm_from_folderId` , `pm_from_deleted` , `pm_from_status` , `pm_to_uid` , `pm_to_folderId` , `pm_to_deleted` , `pm_to_status` )
VALUES ('15', '9', '0', '0', '1', '78', '0', '0', '1');

MySQL sa:

Duplicate entry '15' for key 1

r/ Det löste sig genom att göra både current_id och to_uid till primärnyckel. Tack för hjälpen! :)

PeeerMedlem sedan mars 20025 907 inlägg
#11

r/ va inget :r

136 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
133 ms — hämta tråd, inlägg och bilagor (db)