Ich habe das College noch nicht abgeschlossen und bin mit relationalen Datenbanken zum größten Teil vertraut, da in meinem Datenbankkurs alles, was nicht in BCNF oder 3NF enthalten ist, eine Farce ist. Sicher ist das ein Ende des Extrems, aber mein Team bei der Arbeit scheint es wirklich bis zum entgegengesetzten Ende zu bringen.
In unseren microservice db-Schemata haben Entitäten selten mehr als eine einzelne Tabelle. Alles, was Sie normalerweise in eine andere Tabelle normalisieren würden, wird in einer json-Spalte gespeichert. Wenn später festgestellt wird, dass eine der Eigenschaften in diesem JSON abgefragt werden muss, wird eine neue Spalte hinzugefügt und die Daten werden an beiden Stellen gespeichert (ja, in zwei verschiedenen Spalten in derselben Tabelle).
In vielen Fällen haben diese JSON-Spalten definitiv einen Vorteil. Wenn Sie diese Daten niemals abfragen müssen und niemals eine einseitige Änderung vornehmen müssen (was Sie offensichtlich nicht vorhersagen können), ist dies keine schlechte Idee. Darüber hinaus sehen viele unserer Services entweder keinen Server oder werden auf Computern gehostet, auf denen nicht genügend Speicherplatz zur Verfügung steht, sodass die Duplizierung von Daten kein großes Problem darstellt. (Obwohl ich etwas aus der Philosophie heraus generell vermeiden möchte)
Derzeit erstellen wir einen Service, der Regeln basierend auf einer Reihe von Bedingungen, deren Eigentümer sie sind, entspricht, und führen dann eine Reihe von Aktionen aus, die diesen Regeln zugeordnet sind, wenn die Regeln erfüllt sind (z. B. alle Bedingungen erfüllt sind). Mein Sub-Team, das diesen Service am schnellsten aufbaut, ist der Ansicht, dass die Normalisierung von Aktionen und Bedingungen von den Regeln im Schema weg einen erheblichen Vorteil hat. Offensichtlich pflegen diese Tabellen Fremdschlüsselbeziehungen mit der Regel-ID. Aus unserer Sicht können wir vermeiden, dass Daten bei Bedingungen dupliziert werden, sodass wir sicherstellen, dass sie nur einmal ausgewertet werden. Außerdem können wir die Bedingungen und Regeln, die wir benötigen, bei Bedarf leicht finden, ohne jede einzelne Regel herausziehen und im Speicher suchen zu müssen.
Er hat heute mit einem unserer Hauptingenieure gesprochen und versucht, mich von diesem Schema fernzuhalten. Der Versuch, in jeder Hinsicht zu argumentieren, dass wir es nicht wirklich brauchen, wird in Zukunft zu Leistungsproblemen führen und auf einen alten Monolithen verweisen, den wir besitzen und der eine Designtravestie darstellt. Er bezeichnete das, was wir tun, als "den alten Weg" und flache Tische mit json als "den neuen Weg". Er argumentierte, dass wir an Orten, an denen ich Atomizität will, diese nicht brauchen und dass wir anstelle von Abfragen mehr Dinge im Gedächtnis tun sollten. Dies ist ein Konstruktionsprinzip, dem viele unserer Dienstleistungen jetzt folgen. Wir gehen nicht davon aus, dass das Datenvolumen erheblich ansteigen wird, was unsere Abfragen beschleunigen dürfte. Was wir vorwegnehmen, ist viel Zeit, die für die Bewertung von Regeln und die Durchführung von Aktionen aufgewendet wird.
Ich verstehe, dass nicht relationale Datenbanken in den letzten Jahren immer beliebter wurden, aber selbst wenn ich aktiv nach Informationen über die Auswirkungen von Fremdschlüsselbeziehungen auf die Leistung suche, sehe ich nicht viele Informationen, die für ihn sprechen. Ich nehme an, dass sie dazu neigen, große Transaktionen einzuführen, die Probleme verursachen können, aber das scheint ein Problem zu sein, das vom Fremdschlüssel selbst unabhängig ist.
Ist das meine Naivität? Oder fehlt mir und meinem Sub-Team wirklich etwas? Ich habe ausdrücklich keine detaillierten Informationen zu unserem Problem angegeben, da ich nicht unbedingt nach einer Lösung dafür suche. Angesichts der Tatsache, dass dies ein allgemeiner Trend in unserem größeren Team ist, bin ich sehr gespannt, ob sie etwas damit anfangen können.