Ich habe einen großen Datensatz mit 9 Millionen JSON-Objekten mit jeweils ~ 300 Bytes. Dies sind Beiträge eines Link-Aggregators: Links (URL, Titel und Autoren-ID) und Kommentare (Text und Autoren-ID) + Metadaten.
Es kann sich durchaus um relationale Datensätze in einer Tabelle handeln, mit Ausnahme der Tatsache, dass sie ein Arrayfeld mit IDs haben, die auf untergeordnete Datensätze verweisen.
Welche Implementierung sieht solider aus?
- JSON-Objekte in einer PostgreSQL-Datenbank (nur eine große Tabelle mit einer Spalte, nämlich das JSON-Objekt)
- JSON-Objekte in einer MongoDB
- Explodieren Sie die JSON-Objekte in Spalten und verwenden Sie Arrays unter PostgreSQL
Ich möchte die Leistung in Joins maximieren, damit ich die Daten massieren und untersuchen kann, bis ich interessante Analysen finde. An diesem Punkt denke ich, dass es besser ist, die Daten in eine für jede Analyse spezifische Form umzuwandeln.
Antworten:
Beim Laden von Daten übertrifft Postgre MongoDB. MongoDB ist fast immer schneller, wenn die Anzahl der Abfragen zurückgegeben wird. PostgreSQL ist bei Abfragen mit Indizes fast immer schneller.
Check this out Webseite und diese eine zu für weitere Informationen. Sie haben sehr detaillierte Erklärungen.
quelle
Sie können mehr vom schemenlosen Design von Mongodb profitieren. Dies bedeutet, dass es sehr einfach ist, Datenstrukturen im laufenden Betrieb zu ändern.
In Mongodb gibt es keinen Join. Wie man über Daten denkt und wie man sie verwendet, muss geändert werden, um dokumentbasierte und schemenlose Datenbankumgebungen zu berücksichtigen.
Vielleicht wird Geschwindigkeit weniger wichtig, wenn sich Perspektive und Prioritäten ändern.
Ich hoffe das hilft.
-Todd
quelle
Für die Zahlen, die Sie erwähnen, sollten meiner Meinung nach alle Alternativen funktionieren (lesen Sie: Sie können Ihre Analyse in angemessener Zeit abschließen). Ich empfehle ein Design, das zu deutlich schnelleren Ergebnissen führen kann.
Wie bereits erwähnt, ist postgresql im Allgemeinen schneller als mongo, manchmal mehr als viermal schneller. Siehe zum Beispiel: http://www.enterprisedb.com/postgres-plus-edb-blog/marc-linster/postgres-outperforms-mongodb-and-ushers-new-developer-reality
Sie sagten, dass Sie daran interessiert sind, die Leistung bei Joins zu verbessern. Ich gehe davon aus, dass Sie daran interessiert sind, Ähnlichkeiten zwischen den Entitäten (z. B. Post, Autor) zu berechnen, sodass Sie die Tabelle hauptsächlich selbst (z. B. nach Post oder Autor) und aggregieren.
Hinzu kommt, dass Ihre Datenbank nach dem ersten Laden schreibgeschützt ist, was das Problem sehr gut für die Indexnutzung geeignet macht. Sie zahlen nicht für die Indexaktualisierung, da Sie keine haben und ich denke, Sie haben den zusätzlichen Speicher für den Index.
Ich hätte postgres verwendet und die Daten in zwei Tabellen gespeichert:
Tabellenbeiträge erstellen (post_id integer, url varchar (255), author_id integer);
- Laden Sie Daten und erstellen Sie dann die Indizes. - Dies führt zu einem schnelleren Laden und besseren Indizes, wenn Tabellenbeiträge geändert werden. Fügen Sie den Primärschlüssel posts_pk (post_id) hinzu. Index post_author für Beiträge erstellen (author_id);
Tabellenkommentare erstellen (comment_id-Ganzzahl, post_id-Ganzzahl, author_id-Ganzzahl, Kommentar varchar (255)); Tabellenkommentare ändern Constraint-Kommentar hinzufügen_pk Primärschlüssel (comment_id); Erstelle einen Index comment_author für Kommentare (author_id); Erstelle einen Index comment_post für Kommentare (post_id);
Dann können Sie die Autorenähnlichkeit basierend auf Kommentaren in Abfragen wie select m berechnen. author_id als m_author_id, a. author_id als a_author_id, zähle (eindeutige m.post_id) als Beiträge aus Kommentaren als m verbinde Kommentare als using (post_id) -Gruppe von m.author_id, a. author_id
Wenn Sie daran interessiert sind, die Wörter im Kommentar für nlp zu token, fügen Sie eine weitere Tabelle hinzu. Beachten Sie jedoch, dass dadurch das Datenvolumen erheblich erhöht wird. In der Regel ist es besser, nicht die gesamte Tokenisierung in der Datenbank darzustellen.
quelle