Tecnica corretta per la memorizzazione dei dati degli eventi degli utenti


12

Sono principalmente autodidatta quando si tratta di progettare database. Sto ponendo questa domanda perché mi sono basato su questa struttura comune, ma mi chiedo se sia il metodo più efficiente o "standard di settore".

La maggior parte dei database che progetto hanno una tabella utente e quindi un'attività di persone viene tracciata in un'altra tabella. Capisco che la bellezza del database sia quella di avere questo tipo di efficienze, ma la tabella delle attività raccoglierà molti eventi abbastanza rapidamente da ogni utente che lo utilizza regolarmente, diventando così una tabella enorme abbastanza rapidamente con un uso moderato da parte dell'utente. È questa buona pratica lasciarla crescere in questo modo? O è un livello di tabelle o suddivisione in tabelle diverse in base alle date o per quantità di utenti o qualcos'altro?

+--------------------+                   +------------------------+
|   UserData         |                   |   Activity             |
+-=------------------+                   +------------------------+
| ID     (auto uint) | <--1-to-many-+    | ID  (auto uint)        |
| UserName (text)    |              +--> | UserID (uint)          |
| Email    (text)    |                   | Timestamp (time)       |
| additional info... |                   | Type (ID to elsewhere) |
+--------------------+                   | additional info...     | 
                                         +------------------------+

Vorrei solo sapere dove posso migliorare qualsiasi cosa, per aiutarmi a imparare.

Risposte:


5

O è un livello di tabelle o suddivisione in tabelle diverse in base alle date o per quantità di utenti o qualcos'altro?

Potresti voler esaminare il concetto di "partizionamento" nel tuo database. La maggior parte dei RDBMS ha un supporto per loro (ad es. Mysql , oracle , sql server , postgresql ). Fondamentalmente, lasci che RDBMS gestisca il processo di creazione / gestione del fatto che ogni mese / anno / qualunque cosa sia memorizzata in una tabella separata, mentre il codice che accede ad essa lo considera come una grande tabella.

È possibile partizionarlo per nome utente, data o qualunque cosa verrà utilizzata più frequentemente per accedere ai dati. (ci sono vantaggi / svantaggi di renderlo incentrato sull'utente rispetto alla data centrata ... ma non so se vuoi che mi occupi di tutto ciò)


Grazie @Joe, l'ho letto su Wikipedia ( en.wikipedia.org/wiki/Partition_%28database%29 ) e su alcuni dei link che hai pubblicato. Il tipo di partizionamento a cui ti riferiresti sarebbe il partizionamento orizzontale. Questa è una caratteristica che non sapevo esistesse fino ad ora. Porrò ora una nuova domanda: dba.stackexchange.com/questions/4134/… che richiede la corretta pratica di partizionamento.
CenterOrbit dal

6

Hai fatto un'ottima osservazione. La tabella delle attività crescerà rapidamente e in grande. Quello che ho fatto in passato è archiviare i dati più vecchi (diciamo più vecchi di 14 giorni) in una tabella ActivityHistory . In questo modo la tabella delle attività viene mantenuta a dimensioni gestibili e, se è necessario effettuare ricerche, è sempre possibile guardare indietro alla tabella ActivityHistory .


1
Mi piace la tua idea, ed è una soluzione che si adatta a quasi tutte le impostazioni del database anche quelle che non supportano la soluzione @Joe. Tuttavia, ciò complicherebbe anche alcune delle query coinvolte se fosse necessario accedere ai dati archiviati più vecchi e creare la necessità di aggiungere un sindacato. Molto bene, però, non ho pensato a questo approccio. Grazie.
CenterOrbit,

Questo non è necessariamente complicato, puoi giocare con le stringhe di connessione dall'app per scegliere la cronologia db nel caso in cui i dati siano più vecchi .. Oppure puoi usare server collegati nelle procedure e nel caso in cui un po 'di datetime sia più vecchio di x giorni, vai al server collegato Archivio anziché al server principale.
Marian,

È ancora meno complicato se la tabella ArchiveHistory si trova nello stesso database.
Michael Riley - AKA Gunny,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.