Richtige Technik zum Speichern von Benutzerereignisdaten

12

Ich bin größtenteils Autodidakt, wenn es um Datenbankdesigns geht. Ich stelle diese Frage, weil ich mich auf diese gemeinsame Struktur geeinigt habe, mich aber frage, ob sie die effizienteste oder die branchenüblichste Methode ist.

Die meisten Datenbanken, die ich entwerfe, haben eine Benutzertabelle, und dann wird eine Personenaktivität in einer anderen Tabelle verfolgt. Ich verstehe, dass die Schönheit der Datenbank darin besteht, diese Art von Effizienz zu erzielen, aber die Aktivitätstabelle erfasst viele, viele Ereignisse ziemlich schnell, nur von jedem Benutzer, der sie regelmäßig verwendet, und wird so ziemlich schnell zu einer riesigen Tabelle mit mäßiger Benutzerauslastung. Ist dies die beste Vorgehensweise, um es einfach so wachsen zu lassen? Oder handelt es sich um eine Tabellenebene oder eine Aufteilung in verschiedene Tabellen basierend auf dem Datum, der Anzahl der Benutzer oder etwas anderem?

+--------------------+                   +------------------------+
|   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...     | 
                                         +------------------------+

Ich möchte nur wissen, wo ich etwas verbessern kann, um zu lernen.

CenterOrbit
quelle

Antworten:

5

Oder handelt es sich um eine Tabellenebene oder eine Aufteilung in verschiedene Tabellen basierend auf dem Datum, der Anzahl der Benutzer oder etwas anderem?

Möglicherweise möchten Sie das Konzept der 'Partitionierung' in Ihrer Datenbank untersuchen. Die meisten RDBMS unterstützen sie teilweise (z. B. mysql , oracle , sql server , postgresql ). Grundsätzlich überlassen Sie dem RDBMS den Prozess des Erstellens / Verwaltens der Tatsache, dass jeder Monat / jedes Jahr / was auch immer in einer separaten Tabelle gespeichert ist, während der Code, der darauf zugreift, es als eine große Tabelle behandelt.

Sie können es nach Benutzername, Datum oder dem Typ partitionieren, der für den Zugriff auf die Daten am häufigsten verwendet wird. (Es gibt Vor- und Nachteile, es benutzerorientiert gegenüber datumsorientiert zu machen ... aber ich weiß nicht, ob Sie wollen, dass ich das alles durchführe.)

Joe
quelle
Danke @Joe, ich habe in Wikipedia ( en.wikipedia.org/wiki/Partition_%28database%29 ) und einigen der von Ihnen geposteten Links nachgelesen . Die Art der Partitionierung, auf die Sie sich beziehen würden, wäre die horizontale Partitionierung. Dies ist eine Funktion, von der ich bis jetzt nicht wusste, dass sie existiert. Ich werde jetzt eine neue Frage stellen: dba.stackexchange.com/questions/4134/…, die eine korrekte Partitionierungspraxis verlangt.
CenterOrbit
6

Sie haben eine sehr gute Beobachtung gemacht. Die Aktivitätstabelle wird schnell und groß. In der Vergangenheit habe ich die älteren Daten (z. B. älter als 14 Tage) in einer ActivityHistory- Tabelle archiviert . Auf diese Weise bleibt die Aktivitätstabelle auf einer überschaubaren Größe, und wenn Sie Nachforschungen anstellen müssen, können Sie jederzeit auf die ActivityHistory- Tabelle zurückblicken .

Michael Riley - AKA Gunny
quelle
1
Ich mag Ihre Idee und es ist eine Lösung, die für fast alle Datenbank-Setups geeignet ist, auch für diejenigen, die die @ Joe-Lösung nicht unterstützen. Dies würde jedoch auch einige der damit verbundenen Abfragen erschweren, wenn Sie auf die älteren archivierten Daten zugreifen und einen Union-Join hinzufügen müssen. Sehr gut, ich habe nicht an diesen Ansatz gedacht. Vielen Dank.
CenterOrbit
Dies ist nicht unbedingt kompliziert. Sie können mit den Verbindungszeichenfolgen aus der App spielen, um die Verlaufsdatenbank für den Fall auszuwählen, dass die Daten älter sind. Oder Sie können Verbindungsserver in den Prozeduren verwenden und für den Fall, dass einige Daten älter als x sind Tage, gehen Sie zum Archiv-Verbindungsserver anstelle des Hauptservers.
Marian
Noch einfacher ist es, wenn sich die ArchiveHistory-Tabelle in derselben Datenbank befindet.
Michael Riley - AKA Gunny