2009-07-25 19 views
9

Io sono l'attuazione di un sistema di notifica e vedere se questi suggerimenti sono validi per impostare, se uno è migliore dell'altro o una soluzione migliore è disponibile:Suggerimenti per un sistema di notifica utente in MySQL e PHP

una notifica viene aggiunto al database. Un utente ospite/identificativo accede o utilizza il sito. Sono accolti con notifiche che non hanno mai visto prima con l'opzione di chiudere o leggere più tardi.

  • La tabella di notifica memorizza i testi di notifica e Id.
  • Opzione 1: avvisi tabella memorizza tutti gli utenti che hanno letto la notifica
  • Opzione 2: avvisi tabella memorizza tutti gli utenti che non hanno letto la notifica

Sono queste opzioni molto di un muchness , è meglio aggiungere potenzialmente più di 100.000 avvisi e poiché questi utenti scartano o interagiscono con l'avviso, il loro stato viene modificato o l'avviso cancellato. Questo potrebbe diventare un tavolo molto grande ...

Cos'è una configurazione più estensibile per le notifiche personalizzate in base all'attività dell'utente?

risposta

13

Non lo farei in questo modo. Conserverei un record per ciascuno (utente, notifica) e contrassegno ogni record come letto o non letto. Puoi quindi registrare quando lo leggono, il che potrebbe essere importante in base alla tua applicazione (ad esempio se hai bisogno di una traccia di controllo di qualche tipo).

I record di 100 k non sono molto grandi. Non preoccuparti delle dimensioni finché non ottieni almeno 10 milioni di record. Se necessario archiviarli ad un certo punto. Ma dovresti fare alcune stime su quanto velocemente generi 10 milioni di record. Se sono 3 giorni, allora sì, hai un problema. Se sono 3 anni, allora non lo fai.

Questa opzione ha ovviamente il testo di notifica in una tabella separata.

Questo dovrebbe anche scalare estremamente bene con un numero ancora maggiore di messaggi quando si selezionano i messaggi non letti per un utente (indicizzati) e si può unire per ottenere il testo di notifica (se la tabella è in decine di milioni di dimensioni dei record) o selezionarli e quindi selezionare separatamente i messaggi.

Il partizionamento della tabella (utente, notifica) è semplice: lo si basa su intervalli utente.

E quando gli utenti eliminano i messaggi, in genere si deve semplicemente contrassegnarlo come eliminato piuttosto che effettivamente cancellarlo. La maggior parte delle volte non ci sono molti motivi per cancellare qualcosa in un database.

+0

Desidero tenere traccia dei tempi di lettura ecc. E disporre di una traccia di controllo come si dice in modo raro se mai si cancella, basta cambiare lo stato a d per eliminare, ad esempio. La mia preoccupazione principale era la dimensione, quindi forse leggere le notifiche potrebbe essere aggiunto a una tabella separata, altrimenti potrebbe essere archiviato in un file di registro al di fuori del database? Mi aspetto di filtrare regolarmente anche se un tavolo enorme potrebbe causare problemi. Sto pensando a 100.000 record per notifica, quindi prenderei 2 settimane/milione di record –

1

In alternativa, è possibile memorizzare una serie di riferimenti alle note che devono ancora essere letti in base al profilo utente, quindi rimuoverli quando vengono visualizzati (il caso di utilizzo generale è probabilmente letto tutte le note a una volta). In questo modo hai solo una piccola query quando fai un singolo utente e il tuo costo è nel tempo di inserimento per il messaggio globale, piuttosto che filtrare una grande tabella di messaggi non letti.

5

sto codifica il mio sito web e hanno la stessa domanda, ma mi sono risolto in questo modo:

  1. Conservare tutti i record in una tabella le notifiche.
  2. Read/Unread = true/false
  3. Lavoro CRON: cancella le vecchie 10 notifiche se l'utente ha più di 50 notifiche.

Penso che Facebook esegua periodicamente un cron job per cancellare vecchie notifiche che non possiamo vedere dopo che è stata raggiunta la nostra notifica di limite.

Problemi correlati