2017-03-04 1 views
0

Ich arbeite derzeit an der Erstellung einer Webanwendung, wo jeder Kunde mehrere Projekte erstellen kann. Für jedes Projekt wird der Benutzer Tausende von Datenzeilen (1.000-50.000) hochladen, nennen wir sie "Beiträge".Web Application Database - Optimale Leistung und Skalierbarkeit

Ist es besser, eine einzelne Projektdatenbank zu erstellen, in der jede Zeile ihre Projekt-ID enthält, eine Datenbank pro Kunde erstellen, wobei jede Zeile ihre Projekt-ID oder eine Datenbank pro Projekt enthält.

"Besser" ist definiert als bessere Leistung und Skalierbarkeit. Alle Beiträge aus jedem Projekt werden in maschinellen Lernalgorithmen mit Tausenden von Funktionen (5.000-10.000) verwendet und den Benutzern als positiv oder negativ angezeigt. Wir müssen uns noch für eine Datenbank entscheiden.

+0

Können Sie genauer sein, was sind die Abfragen, die Sie mit den Daten lesen oder schreiben planen? Der erste Schritt scheint ein "schwerer" Schreibauftrag zu sein, um die Daten einzufügen, wenn möglich in Stapel zu trennen. In welcher DB benutzt du MongoDB, PostgreSQL, andere? –

+0

@RistoNovik Haben Info hinzugefügt. –

+0

Vielen Dank für die zusätzlichen Informationen, wie es scheint nicht üblich CRUD Anwendung mehr wie Daten hinzufügen und dann vergessen. Werden die "Posts" -Daten nur hochgeladen und danach nicht mehr aktualisiert? Wenn dies der Fall ist und die Daten nicht strukturiert sind, warum nicht in komprimierten CSV-Dateien speichern? –

Antwort

1

Wenn ich Ihre Anwendung richtig verstehen, vergleichen Sie derzeit zwei Lösungen:

  1. Erstellen N Datenbanken, jede enthält 1 Tisch, mit 1 Projektdaten
  2. 1 Datenbank erstellen, mit 1 Tisch, enthaltend N Projekte data

Es ist eine dritte Möglichkeit, (eine zusätzliche Spalte für die ID-Projekt erfordert), die

ist
  1. 1 Datenbank erstellen, die N-Tabellen, die jeweils 1 Projekt

Leistung: Der Performance-Unterschied zwischen (1) und (3) neigen dazu, unbedeutend sein, wenn Sie zu einem bestimmten Zeitpunkt nur auf Daten eines Projekts zugreifen (und alle im Fall von (1) auf demselben Server ausgeführt werden). (3) ist tendenziell schneller und einfacher, wenn Sie auf mehrere Projekte gleichzeitig zugreifen. Thereisaton von Informationen über Stackoverflow den anderen beiden Optionen vergleicht (2) und(3), single-Tabelle vs. Mutiple-Tabelle. Meistens ist der Leistungsunterschied gering, mit guten Indizes, aber nicht unbedeutend.

Skalierbarkeit: Sie geben an, dass jedes Projekt in der Reihenfolge von Tausenden von Zeilen vorhanden ist. Sie geben nicht an, wie viele Projekte es geben könnte. Sie geben auch nicht an, wie oft diese Daten angefordert oder geändert werden müssen. Das Folgende ist nur eine Richtlinie: Moderne Server können problemlos Millionen von Zeilen (bei 1k/Zeile, das sind nur Gigabyte) in einer einzigen Datenbankinstanz verarbeiten und problemlos Tausende von Anfragen pro Minute (bei richtiger Gestaltung) verarbeiten. Sie beginnen zu kämpfen, wenn es um Milliarden von Zeilen oder mehr geht (mehrere Terabyte an Daten) oder multiple thousands of requests per second. Es hängt viel vom Design der Datenbank selbst ab, wann genau Sie die metaphorische Wand treffen werden. Wenn Sie jedoch eine Größe getroffen haben, bei der eine Datenbankinstanz aus Gründen der Größe oder Geschwindigkeit nicht mehr mit ihr umgehen kann, müssen Sie entweder horizontally or vertically skalieren . Die horizontale Skalierung (d. H. Das Hinzufügen weiterer Server) ist mit mehreren Datenbanken einfacher und kostengünstiger. Wenn Sie Ihre Projekte in eine andere Datenbank aufteilen, kann dies zwar einfacher werden, aber eine solche einfache Lösung wird höchstwahrscheinlich dazu führen, dass viele Server nur herumlaufen, während andere heiß laufen. Die meisten modernen Datenbanksysteme ermöglichen die Aufteilung einer einzelnen Datenbank auf mehrere Maschinen sogar innerhalb einer Datenbank.

Am Ende haben Sie nicht genug spezifiziert, um Ihre Frage wirklich zu beantworten. Und von der Art, wie du es geschrieben hast, vermute ich, dass du momentan noch nicht in der Lage bist, eine endgültige Entscheidung zu treffen - du versuchst nur, dich nicht in deinen eigenen Fuß zu schießen. Also hier ist eine kurze Anleitung zu

Wie sich nicht schießen im Fuß

  • Separate alle Datenbankzugriffscode aus in einer einzigen Einheit des Codes.
  • Halten Sie alle Programmlogik außerhalb des Codes
  • das Stück Code halten gut gepflegt und dokumentiert
  • auf Ihre Fragen suchen jemanden mit Wissen von mehreren DBMS Lassen sie leicht zu transportieren sind, um sicherzustellen,

Wenn Sie dies tun, können Sie später Datenbanksysteme ändern oder die Partitionierung von Daten ändern, indem Sie nur diese eine Datei ändern. Sie können sogar verschiedene Designs benchmarken, indem Sie nur diese einzelne Codedatei austauschen.

0

Ein Blick auf Ihre kurze Frage haben Sie drei Einheiten: N User , (N * 1000) Project, (N * (N*1000) * 50000)Posts

Basierend auf meiner Annahme, dass über maschinelles Lernen Sachen und sclability sprechen, so kann ich sicher ein Minimum von 100.000 Benutzer annehmen. Jeder Benutzer kann mehrere Projekte erstellen, sagen wir 1000. Jedes Projekt kann 50.000 Beiträge haben.

100,000 Users * 1000 Project * 50,000 Posts.

RDBMS Lösung wäre, um wirklich Create User table(UserId, Name etc..), Create Project Table (ProjectId, etc..) Create Mapping table for UserProject (UserProjectId, UserId, ProjectId) Create Posts table (PostId, PostContent..., PostDate)

Die letzte Tabelle auf den tatsächlichen Daten abhängt und/Schreibfrequenz lesen. Wenn Sie nur mit wenig Einfügevorgang Leseleistung wollen, können sie in jedem modernen RDBMS ziemlich erreichbar sein, mehrere Option:

  • Eine Tabelle UserPosts (UserProjectId, postID) Das wird riesig Tisch sein wird definitiv Milliarden Reihen überqueren aber es kann damit umgehen.
  • Sie können abhängig vom Volume mehrere UserPosts-Tabellen für den Bereich von UserProjectId erstellen und anschließend eine Ansicht/Funktion erstellen, um zu entscheiden, welche Tabelle basierend auf UserProjectId ausgewählt werden soll.
Verwandte Themen