Ich möchte ein Produkt entwerfen, mit dem Kunden ihre eigenen Websites erstellen können. Ein Kunde ist in der Lage, das Datenmodell seiner Website im laufenden Betrieb zu pflegen, Abfragen durchzuführen und die Ausgabe auf einer HTML-Seite anzuzeigen. Ich bezweifle, dass eine traditionelle RDMBS aus zwei Gründen die richtige Wahl ist; Mit jedem Kunden wächst die Datenmenge und das RDBMS kann selbst bei Skalierung an seine Grenzen stoßen. Da das Datenmodell sehr dynamisch ist, werden viele DDL-Abfragen das gesamte System verlangsamen.SaaS-System mit dynamischem Datenmodell in Produktion
Ich versuche herauszufinden, welches Datenbank/Datenspeichersystem die beste Option für ein solches System sein könnte. Vor kurzem habe ich viel über NoSQL-Lösungen wie Cassandra und MongoDB gelesen und es sieht vielversprechend in Bezug auf die Leistung aus, hat aber einen Fehler: Es sind keine relationalen Daten, daher müssen Daten denormalisiert werden.
- Ich weiß nicht, was die Auswirkungen der Denormalisierung einen dynamischen Kunden sein Datenmodell definiert, da die Kundenmodelle und fügen Daten zuerst (in einer relationalen Weise) und dann die Abfragen tun danach. Die Denormalisierung muss automatisch erfolgen, was zu einem anderen Problem führt: Kann ich für jede Abfrage eine Tabelle erstellen, auch wenn einige Abfragen ähnlich sein könnten? Es kann nach einiger Zeit eine hohe Datenredundanz geben.
- Hat das Erstellen/Aktualisieren von Tabellen im laufenden Betrieb Auswirkungen?
- Jedes Mal, wenn der Kunde Daten ändert, müssen dieselben Daten in allen Tabellen geändert werden, die eine Kopie derselben Entität enthalten (wie der Name eines Mitarbeiters muss in "Teammitglied" und auch in "Projektaufgabe" geändert werden)). Sind diese Updates teuer?
- Ist es möglich, Daten mit unbegrenzter Tiefe wie
{"team": {"members": [{"name": "Ben"}]}}
zu verschachteln?
Es könnte sogar noch bessere/andere Ansätze geben, ich bin glücklich für Hinweise.
Hinzufügen Klärung der Anforderungen
Meine Frage tatsächlich ist, wie kann ich eine NoSQL DB wie Cassandra verwenden, um relationale Daten zu erhalten und wird die Lösung noch bessere Leistung zu einem RDBMS verglichen?
Der Kunde denkt relational (weil in der Tat Daten meiner Meinung nach immer relational sind), egal, was DBMS verwendet wird. Und bei diesem Service geht es nicht darum, dass der Kunde den zugrunde liegenden Datenspeicher wählt. Da kann nur einer sein.
Ein Kunde kann sein eigenes relationales Datenmodell definieren, indem er ein Management-Frontend verwendet, das von der Anwendung bereitgestellt wird. Das Datenmodell kann jederzeit vom Kunden geändert werden. In RDBMS ist eine DDL auf einem Produktionssystem keine gute Idee. Über dem Datenschema kann der Kunde benannte Abfragen hinzufügen und diese als Datenquelle auf jeder von ihm erstellten Webseite verwenden.
Ein Beispiel wäre der Name „news“ und in einer Web-Seite eine Abfrage für Nachrichten gegeben sei es wie <ul><li query="news"><h1>[news.title]</h1></li></ul>
verwendet werden würde, die die Abfrage ausführen würden und laufen die Daten durch und die <li>
bei jeder Iteration wiederholen. Das ist das einfachste Beispiel.
In komplexeren Beispielen, wenn SQL verwendet wird, kann die Verwendung von Unterabfragen, die schlecht ausgeführt werden, umfangreich sein. In NoSQL scheint es die Möglichkeit zu geben, zuerst eine Tabelle mit den von der Abfrage benötigten Daten zu denormalisieren und vorzubereiten und dann nur diese Tabelle abzufragen. Alle Änderungen an den betroffenen Daten würden zu einem Update für diese Tabelle führen.Das bedeutet, dass das System für jede Abfrage, die der Kunde erstellt, automatisch eine Tabelle und ihre Daten erstellt und verwaltet, so dass eine große Datenredundanz besteht. Benchmarks geben an, dass Cassandra schnell schriftlich ist, so dass dies eine Option sein könnte.
Ich habe meinen ursprünglichen Beitrag aktualisiert und hoffe, es klarer zu machen. Ich bin völlig neu in NoSQL DBs und ihren Anwendungsfällen, aber ich glaube, egal welche DBMS verwendet wird, sind Daten immer noch relational (nur denormalized). Ich bin gespannt, wie diese Daten in NoSQL-Datenbanken verwaltet werden, wenn ein Update für eine bestimmte Relation/Entität vorliegt. – Normalo
dh. In der azure table storage world verwalten Sie die Konsistenz zwischen denormalisierten aber verwandten Datenmodellen auf zwei Arten. Starke Konsistenz über Batch-Operationen, wenn diese denormalisierten Entitäten den gleichen Partitionsschlüssel haben, ansonsten Konsistenzmuster, die azurblaue Warteschlangen und Worker-Rollen nutzen, um idompotente Operationen zu verarbeiten. Da Cosmos DB out of shelf verschiedene Konsistenzmodelle unterstützt, ist es eine Evolution über Tabellenspeicher. Ihre denormalisierten Datenmodelle sollten für Ihre Anwendungsfälle (Abfrage, Aktualisierung usw.) optimiert sein. –
In noSQL sollten Sie Ihre Tabellenstruktur um Ihre Abfragen herum modellieren. Wenn Sie relationale Daten pflegen möchten, sollten Sie eine relationale Datenbank pflegen. Andernfalls müssen Sie die noSQL-Tabellen dynamisch nicht nur auf den RDBMS-Daten basieren, sondern auf den Abfragen, die diese Daten verwenden.Ich verstehe nicht, Ihre Meinung über eine DDL auf einem Produktionssystem ist keine gute Idee. Sie erstellen ein dediziertes Schema für den Benutzer und stellen es bereit. Sie beschränken die Berechtigungen des Benutzers nur auf seine Tabellen. Außerdem können Sie die Abfragen der Benutzer überprüfen, um zu verhindern, dass der Benutzer alle Tabellen löscht. –