Supponiamo di avere un sito popolare. Dobbiamo implementare la messaggistica simile alla posta tra gli utenti. soluzione tipica è quella di utilizzare 2 tabelle:Database MySQL scalabile per messaggistica simile alla posta
Utenti (user_id)
Messaggi (message_id, sender_id (riferimenti ID_utente), receiver_id (riferimenti user_id), soggetto, corpo).
Questo metodo ha 2 limitazioni significative
- Tutti i messaggi di tutti gli utenti sono memorizzati in una tabella che conduce ad esso di alto carico e diminuendo le prestazioni complessive del database.
- Quando qualcuno deve inviare un messaggio a più utenti contemporaneamente, il messaggio viene copiato (recipients_count) volte.
L'altra soluzione utilizza 3 tabelle:
Utenti (user_id)
Sent_messages (sent_id, sender_id (riferimenti user_id), soggetto, corpo)
Received_messages (send_id, receiver_id (riferimenti user_id), oggetto, corpo)
l'oggetto e il corpo dei messaggi ricevuti vengono copiati dai campi corrispondenti di messaggi inviati.
Questo metodo porta a
- denormalizing database copiando le informazioni da un tavolo all'altro
- Gli utenti possono in realtà delete messaggi inviati/ricevuti senza rimuoverli dai ricevitori/trasmettitori.
- I messaggi richiedono circa 2 volte di spazio in più
- Ogni tabella viene caricata circa 2 volte di meno.
Così qui vanno le domande:
- Chi di progettazione considerato è meglio per alto carico e scalabilità? (Penso che sia il secondo)
- Esiste un altro design di database in grado di gestire un carico elevato? Che cos'è? Quali sono i limiti?
Grazie!
P.S. Capisco che prima di arrivare a questi problemi di scalabilità il sito deve avere molto successo, ma voglio sapere cosa fare se necessario.
UPDATE
Attualmente per le prime versioni sarò con il design proposto da Daniel Vassallo.Ma se tutto andrà bene in futuro, il design sarà cambiato con il secondo. Grazie a Evert per aver dissipato la mia apprensione al riguardo.
Grazie!Ho preso in considerazione anche questo disegno. In realtà, dopo aver postato questa domanda I (mentalmente :)) ha modificato il primo progetto in Users (id_utente) Messaggi (message_id, sender_id, receiver_id, message_content_id) Message_content (message_content_id, subject, body) Quindi entrambi questi disegni sono migliori del primo (nello spazio occupato e nelle prestazioni del tavolo). Forse la domanda deve essere qualcosa di simile: è meglio memorizzare tutti i messaggi in una tabella o copiarli in due? Quanto sarà significativo l'impatto sulla performance? –