Domanda

Sto pianificando di creare un sistema PM per i miei utenti, nel complesso sembra abbastanza facile, ma il modo in cui ho visto tutorial realizzando sistemi PM, c'è un problema.

Nel modo in cui ho pianificato il funzionamento, ci sarebbero righe come, user_from, user_to e quindi il messaggio - user_from sarebbe il mittente e vedrà il messaggio nei suoi messaggi di invio, user_to sarà il ricevitore e vedrà il messaggio in la sua casella di posta. Ma cosa succede se un utente desidera eliminare un messaggio dalla cartella inviata, ma l'altro utente non vuole eliminarlo dalla loro casella di posta ??

C'è un modo semplice per farlo?

Potrebbe anche essere bello avere i messaggi nelle conversazioni, come Gmail e Facebook, ma è forse difficile da codificare (eventuali tutorial apprezzati)?

È stato utile?

Soluzione

Puoi risolvere il problema in pochi modi, ma probabilmente aggiungerei un paio di flag (from_deleted, to_deleted) alla tabella:

  • Invece di eliminare il messaggio, aggiorna il flag appropriato su 1.
  • Quando elencano i messaggi, filtrare quelli che sono stati contrassegnati.
  • È possibile impostare lo script in modo che dopo aver contrassegnato, se entrambi i campi sono contrassegnati, puoi effettivamente Elimina la riga.

Altri suggerimenti

Usa quello che viene chiamato una eliminazione morbida. Ciò significa che quando un record è "eliminato" non viene mai effettivamente rimosso dal database, ma piuttosto un flag è impostato su eliminazione che consente di rimuoverlo da un'interfaccia utente pur avendo accesso ai dati quando ne hai bisogno. Quindi per questa situazione è possibile creare altre due colonne chiamate user_to_delete e user_from_delete. Quando uno di questi è impostato su True, sapresti di non mostrare il messaggio nella posta in arrivo/in cabina dell'utente. Buona fortuna.

Suggerisco la seguente progettazione del database:

MESSAGES
+----------+------------------+---------------------------+
|    id    |    subject_id    |    body                   |
+----------+------------------+---------------------------+

SUBJECTS
+----------+-------------+--------------+-----------------+
|    id    |    title    |    author    |    receivers    |
+----------+-------------+--------------+-----------------+

INBOX
+----------+---------------+--------------+---------------+
|    id    |    user_id    |    msg_id    |    read       |
+----------+---------------+--------------+---------------+

OUTBOX
+----------+---------------+------------------------------+
|    id    |    user_id    |    subject_id                |
+----------+---------------+------------------------------+

Quando si inviano messaggi, si crea una nuova riga per tutti i ricevitori nella tabella della posta in arrivo e nella tabella Outbox One per il mittente. Nella tabella dei messaggi si inserisce una riga con l'ID dell'oggetto e del corpo del messaggio. Nella tabella delle materie si inserisce una riga con il titolo, l'autore e tutti i ricevitori (se il mittente ha avviato un nuovo argomento o ha inoltrato una conversazione completa o un solo messaggio, altrimenti aggiungere il messaggio nella tabella dei messaggi usando l'ID soggetto esistente) in modo che questo Le informazioni vengono mantenute anche se uno dei ricevitori elimina un messaggio dalla sua casella di posta (in questo caso elimina la riga nella tabella della posta in arrivo).

Per l'Eutbox non è necessario un flag di "lettura" e notare che viene utilizzato solo l'ID soggetto.

Un altro approccio sarebbe aggiungere due colonne che determineranno se il proprietario o il destinatario hanno richiesto o meno di eliminare (nascondere) il messaggio.

owner_id | user_from | user_to | mailbox_folder | Message | Owner_hide | Recipient_hide
1          1           2         Sent             Hi         1           0

Sì, c'è un modo semplice per farlo! Avere altre due colonne, rispettivamente sender_deleted e receiver_deleted. Se uno di loro "elimina" il messaggio, è stato aggiornato la colonna con un valore di 1. Ad esempio. Quando si visualizzano i messaggi, selezioni i messaggi assicurati che il valore sia diverso da 1. ecc ...

Creeresti solo 2 righe e aggiungi una colonna. esempio:

owner_id | user_from | user_to | mailbox_folder | Message
1          1           2         Sent             Hi
2          1           2         Inbox            Hi

Altre colonne: un ID di riga univoco, timestamp, oggetto, ecc ...

Le cassette postali verrebbero quindi costruite dalla colonna di proprietario_id e ogni utente ha la propria copia per spostarsi/eliminare come desiderano.

Per aggiungere conversazioni, è possibile aggiungere una colonna o un'altra tabella. Se si tratta di un nuovo messaggio, ricevi un nuovo ID di conversazione, altrimenti usa lo stesso ID. Query di Timestamps.

È possibile aggiungere una riga User_From_Deleted e user_to_deleted e visualizzare un messaggio solo se non è eliminato.

Per visualizzare i messaggi nelle conversazioni è possibile aggiungere un parent_id e visualizzare tutti i messaggi con lo stesso parent_id

Un sistema PM è un po 'più complesso di un tavolo. E se PM più di una persona? In questo caso vorresti più tabelle. Uno per utenti, messaggi, ecc ... li collegheresti utilizzando chiavi primarie ed esterne.

Prova a cercare database relazionali. Questo dovrebbe farti cominciare:http://www.databasejournal.com/sqletc/article.php/1469521/introduction-to-relational-database.htm

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top