Come memorizzare correttamente i messaggi in un servizio web?

3

Stiamo costruendo un webservice multi-tenant con PHP e MongoDB. C'è bisogno di comunicazione tra i dipendenti dei servizi e i clienti, la comunicazione può essere stabilita in molti modi diversi. Alcuni di questi sono: SMS, MMS, Email e, possibilmente, un sistema di chat interno.

La domanda è, come implementare correttamente la struttura del database per questo?

Il mio capo insiste che ci dovrebbe essere una collezione - messages , dove dovremmo memorizzare il mittente, il tipo, il destinatario, il corpo del messaggio, il timestamp e gli argomenti in quel modo, che avremmo un percorso che punta a users/1235/messages , in cui è possibile recuperare la cronologia della chat.

Tuttavia, non sono d'accordo su di esso e lo discuto in questo modo, che ogni tipo di messaggio ha le sue proprietà e impostazioni. Ad esempio, non sarebbe giusto archiviare l'intero corpo del messaggio SMS all'interno di una sola istanza: un SMS può comprendere fino a 6 parti, che vengono consegnate in modo indipendente (hanno il proprio ID di tracciamento). In questo modo, è facile tenere traccia di quali parti sono state consegnate, consentendo così di inviare parti mancanti al posto dell'intero messaggio. Le e-mail hanno anche le loro proprietà come indirizzo, reply-to e altre cose.

Probabilmente penso troppo alla costanza, visto che uso MySQL da molto tempo. Ma, a mio parere, la memorizzazione di tutti i messaggi solo in una collezione darebbe una grande diversità di proprietà nell'oggetto. Tuttavia, la memorizzazione separata di ciascun sistema di messaggi offre opzioni flessibili che consentono di tenere traccia dello stato di ogni messaggio e di altri dettagli. Tutti i messaggi sono stati normalizzati e uniti in un'unica raccolta di dati in seguito. (Concat SMS per costruire tutto il corpo, ecc.)

Quindi, che tipo di soluzione vedresti qui?

    
posta vikingmaster 12.10.2015 - 08:52
fonte

3 risposte

4

Questo mi sembra lo stesso problema con cui avresti memorizzato le sotto classi in un database relazionale.

es. hai una classe Messaggio astratta con alcuni campi comuni, Id, SenderId ecc e quindi sottoclassi come SMSMessage, EmailMessage con campi aggiuntivi.

Il mio approccio qui è di avere una tabella Message con le colonne comuni più 'Type' e 'TypeId' quindi una tabella per tipo con i dati specifici del tipo extra

Questo crea una relazione strana, ma ti permette di fare domande semplici, 'ottenere tutti i messaggi indipendentemente dal tipo', più complicato, 'ricevi messaggi sms dove alcune parti non sono riuscite ad inviare'

La conversione in un approccio NoSql solleva alcune domande interessanti su quanti tipi di oggetti si desidera avere una singola raccolta. Tuttavia, credo che il client c # MongoDb ti permetterà di mettere le sottoclassi nella stessa collezione e deserializzarle correttamente da BSON (presumendo che tu abbia impostato i mapping). Suggerisco che questo è l'approccio che si aspetta che tu prenda.

Se hai diviso questi oggetti in più raccolte, come applicheresti l'integrità della relazione? Sembra un approccio in stile RDB per me, che ti darebbe ulteriori problemi.

    
risposta data 12.10.2015 - 13:25
fonte
0

Suppongo che con Mongo mettere tutto su una raccolta polimorfica non sia irragionevole.

Per ogni messaggio puoi mettere in valigia i dettagli relativi al suo tipo, perché non sei limitato da uno schema relazionale. Il codice di elaborazione / visualizzazione dovrebbe essere piuttosto flessibile, tuttavia, pronto per scoprire ulteriori dettagli in un record e pronto a gestire l'assenza di determinati dettagli. Col tempo, il formato dei dati cambierà inevitabilmente leggermente.

Detto questo, devi avere alcuni campi strettamente richiesti, come e ID e un timestamp, che indicizzerai per un accesso rapido.

    
risposta data 12.10.2015 - 15:05
fonte
0

Deciderei in base al mio design dell'interfaccia utente.

Se ho un'interfaccia utente separata per ogni tipo di messaggi - SMS, email, ecc. e una sola chiamata semplice è tutto ciò di cui ho bisogno per ottenere i dati richiesti per ciascun tipo, quindi separerò ogni tipo di messaggio.

Tuttavia, se l'interfaccia utente è progettata in modo tale da richiedere la visualizzazione di tutti i tipi di messaggi sullo stesso schermo, li metterà in squadra tutti insieme.

L'intenzione è quella di colpire il DB il meno possibile. Allo stesso tempo, cercando di mantenere la query il più semplice ed efficiente possibile.

    
risposta data 12.10.2015 - 17:40
fonte

Leggi altre domande sui tag