BigData - Tabellen mit enorm vielen (>1 Bio) Datensätzen

Froschkoenig84

Aktiver Benutzer
Beiträge
27
Hallo Profis.

Zunächst mal, das ist keine rein technische Frage, sondern mehr eine philosophische...

Ich habe vor, eine überraschend große/breite Plattform aufzubauen, die jede Menge Nutzer-Objekte enthält, die von anderen Nutzern "geliked" werden können. - Like-Relation zwischen Nutzer und Objekt also.

USERs <> LIKEs <> OBJs

In der Like-Tabelle (typisch Relationstabelle) befinden sich nur die UserIds und die ObjektIds, ggf. noch ein Zeitstempel. Zwar werde ich nicht gleich Facebook Konkurrenz machen, aber wenn ich Best- und WorstCases hochrechne komme ich auf 10 Mio User (später sicherlich noch mehr), die täglich im Schnitt 25 Objekte anlegen und ca. 100 Likes abgeben. Was bereits 1 Mrd Likes pro Tag sind (Twitter generiert 4 Mio Favs pro Minute).

Prinzipiell sind 1 Mrd Datensätze (Relationstabelle mit IDs) datenbankseitig problemlos zu managen, aber das ist ja nur der Anfang, denn nach 10 Jahren wären das bereits 3.5 Billionen Datensätzen. - Ich hab das mal ausprobiert und festgestellt, dass selbst einfache Relationstabellen bei 1 Billion Datensätzen bereits sehr träge werden.

Jeder, der schon mal ein Forum oder einen wirklich großen Blog umgesetzt hat, weiß wie schnell man in die Mrd-Records gerät. Was am Anfang noch handlebare Größen sind, werden mit den Jahren gigantische Mengen an Datensätzen. Ich gebe zu, dass ich mich im BigData nicht immer 100%ig an die 3NF halte, aber zumindest versuche ich es, auch wenn ich meine Tabellen und DB-Gruppen ein wenig controllerlastig entwerfe.

Aber wie managed man Billionen von Datensätzen? Ich nutze primär MSSQL und spiele mit dem Gedanken, irgendwann auf MongoDB umzusatteln. Dennoch sind Billionen Datensätze nun mal immer ziemlich hart, egal welche Technik darunter läuft.

Hat jemand von euch Erfahrungen mit wirklich großen Zahlen und Datenmengen? Welche Technik, welche Tricks und Kniffe, welche Kombinationen und welche Form der Umsetzung bieten sich an, um wirklich sehr große Mengen an Datensätzen zu verwalten? - Bisher bin ich meistens mit Tabellen unter 1 Mrd. Datensätze unterwegs gewesen. Mein aktuelles Projekt nutzt ca. 60 Tabellen und ein paar Relationstabellen darunter, füllen sich eben besonders schnell. :/
 
Werbung:
Mit Erfahrungen kann ich auch nicht aufwarten. Ich verstehe aber auch nicht was an der Frage philosophisch betrachtet werden könnte, ist eigentlich eine rein technische Frage.

In einem Beispiel wie Twitter "verfallen" die Datensätze im Prinzip. Wird dein Objekt oder was auch immer geliked wurde nicht mehr aufgerufen weil es alt ist werden vermutlich auch die Likes nicht mehr abgefragt. Ist das bei deinen Objekten der Fall?

Welche SQL Lizenz kommt denn hier zum Einsatz? Ein DB Cluster oder ein einzelner DB Server?
 
Mit Erfahrungen kann ich auch nicht aufwarten. Ich verstehe aber auch nicht was an der Frage philosophisch betrachtet werden könnte, ist eigentlich eine rein technische Frage.
Na ja, technisch wäre sie, wenn ich nicht nach Erfahrungen fragen würde, sondern eine technische Lösung erwarten würde. ;) Aber mir sind die Abfragen schon klar. Ich werde vermutlich Funktionen/Prozeduren für die wichtigsten Abfragen (besonders für die Relations-Joins) direkt auf dem MSSQL-Server hinterlegen und dann via C#.NET nur noch mit entsprechenden Parametern abrufen.

In einem Beispiel wie Twitter "verfallen" die Datensätze im Prinzip. Wird dein Objekt oder was auch immer geliked wurde nicht mehr aufgerufen weil es alt ist werden vermutlich auch die Likes nicht mehr abgefragt. Ist das bei deinen Objekten der Fall?
Nein, leider nicht. Aber auch bei Twitter müssen die alten Tweets erreichbar bleiben und ich vermute auch die Favs dazu, genau wie auch bei FB, dort lassen sich FanPages, Artikel, Status-Beiträge, Kommentare, Antworten und sogar einzelne Bilder "liken".

Klar könnte ich in so einem Fall für jeden Objekttyp eine eigene Relationstabelle erzeugen, um extreme Längen zu vermeiden. Andererseits sind die Tabellen vom Aufbau nahezu gleich und ich könnte mit einem Typen-Feld eine einzige Tabelle verwenden. Frage mich nur, ob es sinnvoller ist, mehrere mittellange oder eine riesenlange Tabelle anzulegen. Die Abfragen sind ja immer objektspezifisch, außer bei der History-Seite des Nutzers. :/

Man ich wünschte, ich würde bereits vollständig auf MongoDB umsatteln. Aber vorerst versuche ich es erst einmal mit MSSQL (TransactSQL) 2016 (13.0.4001.0). :/

Welche SQL Lizenz kommt denn hier zum Einsatz? Ein DB Cluster oder ein einzelner DB Server?
Ist aktuell ein SharedServer (100 Kunden teilen sich 72TB), aber zurzeit ist der DB-Server relativ ungenutzt von den anderen, weswegen ich 98% der CPU/RAM und ca. 64TB Storage zur Verfügung habe. Geplant ist jedoch tatsächlich ein Cluster, falls ich irgendwann mal Geld damit verdienen werde. (aktuell ist das Projekt kostenlos geplant, erstmal sehen, wie die Nachfrage ist). Alternativ spiele ich mit dem Gedanken, auf MongoDB umzusteigen. - Mal sehen. Wie gesagt, derzeit bin ich noch in der Pre-StartUp-Phase.
 
Zuletzt bearbeitet:
Deine Daten sind ja durchaus für eine relationale Datenbank geeignet, du denkst ja auch in diesem Muster. Was genau willst du mit MongoDB erreichen? Warum nicht z.B. Postgre?
 
Na ja, also PostGre ist bei weitem nicht schnell genug, da ist ja sogar MSSQL schneller. Ich habe Damals noch SQL92 auf Oracle entwickelt, kurz bevor MySQL und etwas später dann PostGre auf den Markt kam. Aber MongoDB ist wirklich sehr viel schneller und die Daten liegen direkt in Objekten vor. Die Getter-/Setter-Methoden entsprechen quasi den Programm-Objekten aus der Klasse. Das vereinfacht auch sehr viel. Man kann sowohl vordefinierte Objekte, aber auch MixedObjects in MongoDB einspielen und die Suche und Filterung danach ist unglaublich tief möglich. Klar, um die Übersicht nicht zu verlieren, versuche ich bei den Objekten pro Collection möglichst unter 4 Dimensionen zu bleiben, aber es wären auch hunderte von Dimensionen möglich. Und da auch große Objekte durchsucht werden können, ist das schneller als wenn ich die Objekte in meiner .NET-Anwendung durchsuche, nur dass ich entsprechend die gewünschten Teilmengen zurück bekomme.

Wenn du nur einzelne Werte inkrementell aus langen aber separaten Listen herausliest, ist SQL sicherlich nützlich. Aber sobald du komplexe und verschachtelte Objekte verwendest, wirst du nix finden, was so schnell und komfortabel ist, wie MongoDB. Wer mit Objekten hantiert wird zwangsläufig früher oder später auf MongoDB setzen.

Allerdings plane ich inzwischen eine Kombination aus verschiedenen Datenbanktechnologien zu integrieren. Denn ab und an, hat man tatsächlich einzelne Werte, die man nicht in ein Objekt verstauen möchte, ähnlich wie auf der verlinkten Seite beschrieben.

Mal sehen. :)
Leider muss ich mich jetzt mehr mit Steuerrecht, Wirtschaft und dem ganzen Sch*** beschäftigen und das, obwohl ich das Produkt zu Beginn vollständig NonProfit gestalten wollte. :/ Na ja... ich lass euch wissen, wie es sich weiterentwickelt.
 
Na ja, also PostGre ist bei weitem nicht schnell genug, da ist ja sogar MSSQL schneller. Ich habe Damals noch SQL92 auf Oracle entwickelt, kurz bevor MySQL und etwas später dann PostGre auf den Markt kam.

PostgreSQL ist über 21 Jahre alt. Möglicherweise stammt Dein Wissen darüber aus dessen Anfangszeit. Zeit für ein Update.

Aber MongoDB ist wirklich sehr viel schneller

https://www.enterprisedb.com/postgr...orms-mongodb-and-ushers-new-developer-reality
Slant - MongoDB vs PostgreSQL detailed comparison as of 2017
 
Okay, dann lag ich wohl falsch, dachte immer das PostGre erst gegen 2001 auf dem Markt erschien. Na gut, sorry. Was dazugelernt.

Was mir bei MongoDB gefällt ist die flexible und simple Skalierung, sowie die JSON/BSON-Implementierung, bei deren Suche simpel durch die einzelnen Knoten bis in die tiefsten Ebenen gesucht werden kann.

Allerdings wusste ich nicht, dass PostGre inzwischen auch eine JSONB-Implementierung anbietet. Die Frage ist, ob sich der ByteCode mit einfachen Abfragen auch innerhalb von Knoten durchsuchen lässt. - Muss ich mich wohl mal einlesen. :)

Macht das schon irgendjemand von euch? Also komplexe JSON-Objekte in PostgreSQL durchsuchen und filtern oder Teilelemente/Knoten mehrdimensionaler Objekte ausgeben?
 
Werbung:
Gut dass es keine GIF-Animation mehr ist:
dcd11c-1509968269.jpg
 
Zurück
Oben