Mehr brandheiße Inhalte
zur Gruppe
Nerds und Gamer
1091 Mitglieder
zum Thema
Wie ist eine langfristige Beziehung zu erreichen?21
Ich bin jetzt seit 4 Jahren Single. Und möchte es nicht mehr sein.
Das Thema ist für dich interessant? Jetzt JOYclub entdecken

*SQL vs "noSQL"

******irl Frau
30 Beiträge
Themenersteller 
*SQL vs "noSQL"
Hey ihr Nerds, Nerdetten und Nerdanier, ich dachte mir ich fange mal hier einfach so ein Thema an das mich neuerdings interessiert, da ich sonst nichtmehr in irgendwelchen Foren aktiv bin wüste ich nicht wo sonst *g*

Ich habe kürzlich meinen Arbeitgeber gewechselt, und bei der Job Recherche ist mir aufgefallen das vor Allem aber nicht nur durch den Vormarsch der Microservice-Architekturen und agilen Entwicklungsverfahren, einige bei neuen Projekten explizit auf nicht *SQL Datenbanken setzen.

(Manchmal steht sogar in der Jobbeschreibung explizit noSQL Database-developer)

Insbesondere Startups scheinen sehr gern auf eine Kombination von nodeJS und MongoDB abzugehen und weniger auf den PHP/SQL Klassiker.

Wie seht ihr das?
Setzt sich die Verwendung von dokumentbasierten Datenbanken wie MongoDB, RethinkDB oder Cassandra langfristig gegen die Etablierten SQL banken wie mySQL, postgreSQL und MSSQL durch?

Auch von hybrid Lösungen (posteSQL und Cassandra) habe ich schon gelesen.

Ich habe nun beides bereits verwendet, und ich muss zugeben das nodeJS mit modernem ECMA 6 (async/await promisses) in Verbindung mit mongoDB und auch RethinkDB mir deutlich mehr Spaß machen als die altbacken PHP/SQL Dinos, mit dem ganzen Apache verwaltungskram (HTACESS und bla bla) drum herum.

Wie seht ihr das? Würdet ihr für neue Private wie Kommerzielle (Web?) Projekte klassische Systeme (PHP/SQL oder auch .net/java mit *SQL) verwenden oder eher auf einen modernen Ansatz wie z.B. nodeJS oder goLang mit "noSQL" setzen?
Bitte recht freundlich
********mmer Mann
2.349 Beiträge
Moin Moin,

ich würde sagen, dass es auf das Projekt drauf ankommt. Gerade wenn es größer wird, ist IMHO SQL die bessere Wahl. Man kann SQL wunderbar skalieren.
Es hängt - wie mein Vorredner schon sagte - vom Anwendungsbereich ab.

Wenn ich wirklich konsequent mit Microservices arbeite, dann ist der noSQL Ansatz sicherlich sinnvoller. Um Beispielsweise User und ihre Password-Hashes zu prüfen reicht mir ein einfacher Key-Value Store. Der Vorteil daran ist, dass das ganze wie ein Lego-Bausatz ist und ich problemlos neue Komponenten in meine Architektur aufnehmen kann wobei dieses eher dem Buzzword Microservice als noSQL zu verdanken ist.

Im Umgekehrten Fall sehe ich allerdings Probleme bei großen Datenmengen. Jede Interaktion zwischen den Daten muss in einem Service abgebildet werden, welcher dann u.U. auf mehreren Datenbanken erforderliche CRUDs durchführt. Das kann man in einer klassichen SQL-Datenbank eben weitgehend per Foreign-Key, Trigger oder Stored Procedures automatisieren und befreit sich so von ein wenig Komplexität im eigentlichen Programmcode.

Ich selbst habe bisher erst ein einziges Mal einen Ausflug in die noSQL Welt gewagt: eine einfache Logging-Database. Im großen und Ganzen habe ich persönlich jedoch keinen Anwendungszweck an noSQL, da fast alle meine Projekte irgendwie an ein ERP-System auf einer relationalen DB angebunden sind.
Ich bin ein Feind aller Marketingwörter wie Microservices, Hyperconverged, etc, aber die Architektur der Microservices macht sehr viel Sinn, egal wie gross das Projekt ist. Wer sich mit Microservices auseinandersetzt wird aber auch schnell merken das relationelle SQL Transaktionen nicht ganz ins Konzept passen, und hier kommt dann noSQL zum Zuge, und auch nur hier. Es macht keinen Sinn eine monolithische Applikation via noSQL mit Daten zu füttern, aber wenn die Dienste fragmentiert sind und die Abstraktion der Funktionen und ihrer Dienste sehr weit fortgeschritten ist, dann ist es schlicht unmöglich mit reinem SQL von einer Quelle zu arbeiten. Was aber nicht heisst das SQL tot ist. Ich habe mittlerweile diverse Applikationen von mono zu services umprogrammiert, und verwende beides, sprich SQL und noSQL. noSQL wo die Daten eher flüchtiger Natur sind und SQL dort wo tiefe Verknüpfungen über FK realisiert werden müssen, weil die Daten anders nicht strukturiert werden können. Wobei hier aber auch gesagt werden muss, viele Applikationen brauchen gar kein SQL, es macht keinen Sinn wenn man nur n-Tabellen hat welche alle 1:n verknüpft sind.

Beispiel: Rohdaten Speichern von hunderten Sendern >> noSQL (da keine Relation nötig ist). Buchhaltung >> SQL (da Doppelte Buchführung in noSQL etwas schwierig umzusetzen ist).

Und genau hier sieht man den Anwendungsbereich: noSQL dient zum Speichern von nur schwach verknüpften Daten (Kommentare auf Instragram Fotos, Twitter, etc) aber in grossen, schier unmenschlichen Massen. Ein ERP auf SQL mit > 1 Mia Buchungen ist mit noSQL nicht performant umsetzbar, jede Eintrag ist mit n anderen Elementen verknüpft.
****nax Mann
42 Beiträge
*wow*
... immer, wenn ich einen solchen Thread lese, vergesse ich, dass ich im Joyclub lese. *cool*.
MfG Sheldon.
P.S. Ach nee, wollte -jay schreiben
P.P.S. Nix Java, no noSql: In meinem Job (Infrastruktur) komme ich nur mit c# und SQL aus.
P.P.P.S. Nichtsdestotrotz muss ich die Qualität der Diskussion sowohl wegen der Korrektheit als auch der dargebotenen Dialektik loben.
all-in-one vs. one-service-per-server
Ahoihoi,

es ist immer die Frage der Rahmenkonditionen. Wenn man was braucht, was einfach nur allein im world-wide-wait steht und nicht zuletzt die Backup-Frage geklaert ist, warum nicht? *g* Wenn man bei noSQL ein sauberes Backup hinkriegt? Wir haben bei uns die grossen Dinger laufen. MSSQL, MySQL, Oracle und PostgreSQL. Daher kann ich zu den anderen Loesungen nichts sagen.

Wenn Du jedoch auf einmal vor den BSI-Bausteinen* stehst, sieht das Ganze schon anders aus. Die schreiben ganz eindeutig vor, dass pro Server nur ein Dienst laufen soll. Wie das jetzt bei noSQL aussieht, muesste man in den Ergaenzungslieferungen gucken oder die einschlaegigen BSI-Hilfsprogramme waelzen. Bei dem Regulierungswahn wuerds nicht wundern.

So oder so - man sieht erst was besser ist, wenns geknallt hat oder Performanceengpaesse kommen *zwinker* Man kann einen Webserver natuerlich mit Varnish entlasten, weil der mehrere gleichlautende Anfragen buendelt, selbst nur eine Anfrage an den Webserver macht und alle Anfragenden mit der Antwort abspeist. Aber ich mag Lastverteilung auf mehrere Server.

Es ist zuletzt aber auch ne Frage, was die Vorgesetzten grad als Schlagwoerter praesentiert bekommen haben. Bei den vergangenen Anstellungen in diversen Rechenzentren, habe ich schon viele Schnappsideen gehoert.
******irl Frau
30 Beiträge
Themenersteller 
Wir haben nun nach längerem Benchmarking und testen uns für eine RethinkDB datenbank für ein Projekt entschieden.
In diesem Projekt soll vor allem dotnetCore 2.0 und alternative Datenbanken in Produktivsystemen getestet werden, unsere kunden können es in der Testphase kostenlos nutzen.

RethinkDB ist neuerdings Opensource, zum einen ist das teil schlank wie sau, das executable ist nur ein paar mb groß und dazu ne optionale config datei das wars, zudem gibts noch ein paar coole features.

Die datenbank selbst ist einfach in einem ordner, fürn backup nur nen befehl in die console oder über die api nen call der alles was im memory ist direkt in die Datein packt, ordner wegzippen, fertig ist das fullbackup.

Gibt aber auch andere backup Methoden und auch Sharding.

Die coolen features die wir nun mal in produktiver Action austesten wollen sind:

  • Steady Connections und Pooling, es lassen sich auf einer connecten parallel mehrere abfragen fahren, klar muss man hier paar regeln beachten wenn man auf dieselben Datensätze gleichzeitig zugreift (idr gibts hier nen lock und der später gekommene anfrage wartet halt kurz (mit .netCore async/await ist das kein wirklicher mehr aufwand)
    Das spart zeit und aufwand verglichen mit dem Klassischen "verbinde für jede abfrage kurz mal). Und das problem mit Parallelen zugriffen gibt es bei anderen DBMS auch.

  • Datensatz callbacks, Dies ist eigentlich die wesentliche funktion die an dem DBMS ziemlich cool ist.
    Man kann ein Callback auf einen Datensatz bekommen, im grunde läuft es so ab das man ein Query abschickt und dazu ein callback, wenn nun an einer der daten in diesem datensatz etwas geändert wird, bekommt man das callback, in welches dann die geänderten daten reingeschrieben werden.
    In verbindung aber nicht nur mit Websockets ist das natürlich echt super spannend. Nicht Mehr regelmäßig irgendwie was anfragen zum schauen ob es änderungen gab.

    Hier muss man schon etwas aus den alten denkweisen herauskommen um das auch effektiv zu nutzen… das war garnicht mal so leicht.

    Wie performant das auf dauer und mit viel daten/callbacks funktioniert bleibt abzuwarten.

  • Sharding, mehrere datenbanken instanzen auf demselben oder verschiedenen rechnern kann man zusammenschalten, und sie so wie eine benutzen. Somit kann man z.b. dauerhaftes backup realisieren in den man ein 2tes shard dazu schaltet das nur dafür da ist den aktuellen stand zu spiegeln und zu sichern, oder jeh nach öfter benötigten daten die Services mit den teil Datenbanken auf eine Maschine legen und diese aber dennoch verbinden und auf andere zugreifen. Ohne das man separat irgendwelche CURLS, WCF Calls oder so fahren muss. Auch die Callbacks gehen über diese Pipe wenn man das möchte. Ein Service A könnte also ein callback bekommen und z.b. seine Datenbank aktualisieren wenn Service B in seine Datenbank etwas geschrieben hat.
    Ohne das die Services sich kennen müssen oder direkt miteinander Kommunizieren müssen.

  • Die Querys sind nicht wie bei SQL etc. irgendwelche beknackten strings (am ende sind es vermutlich schon welche) aber es gibt keine möglichkeit irgendwelche Strings zusammenzubauen und diese als Query abfeuern, das verhindert zum einen das irgendein trottel Injectable code schreibt, zum anderen macht es das einfach angenehmer.
    Im fall von .net / .netCore kann man entweder LINQ aber auch die eigene query API verwenden.

  • Dokumentbasiert, wenn sich am code bzw. den Datenformat irgendwas ändert braucht man nicht wirklich was in der Tabelle mit ALTER TABLE oder son mist zu machen.
    Idr bekommt man auf anfragen JSON objekte oder Arrays mit JSON objekte zurück, und schmeißt JSON objekte da hinein.
    Bzw bei der API die wir verwendet haben gibt es die calls auch als Generische calls.
    Die API wandelt das dann in ein objekt der gegebenen class/struct und umgekehrt.



Bisher ist mein Fazit das es natürlich ungemein spaß macht mit diesen Modernen sachen zu arbeiten, alles geht ratz fatz von der Hand, und fühlt sich schlank und Unbelastet an.

Ich Schreib euch mal in nem Jahr oder halben Jahr was draus geworden ist, wo die Probleme waren und was so die Performance bei größeren Projekten und Datensammlungen angeht.
Anmelden und mitreden
Du willst mitdiskutieren?
Werde kostenlos Mitglied, um mit anderen über heiße Themen zu diskutieren oder deine eigene Frage zu stellen.