Ich habe gerade einen Artikel über Microservices und PaaS-Architektur gelesen . In diesem Artikel, ungefähr ein Drittel des Weges nach unten, erklärt der Autor (unter Denormalize wie Crazy ):
Refaktorieren Sie Datenbankschemata und de-normalisieren Sie alles, um eine vollständige Trennung und Partitionierung von Daten zu ermöglichen. Verwenden Sie keine zugrunde liegenden Tabellen, die mehrere Microservices bedienen. Es sollte keine gemeinsame Nutzung von zugrunde liegenden Tabellen geben, die sich über mehrere Mikrodienste erstrecken, und keine gemeinsame Nutzung von Daten. Wenn mehrere Dienste Zugriff auf dieselben Daten benötigen, sollten diese stattdessen über eine Dienst-API (z. B. eine veröffentlichte REST- oder eine Nachrichtendienstschnittstelle) gemeinsam genutzt werden.
Während dies theoretisch großartig klingt , muss es in der Praxis einige ernsthafte Hürden überwinden. Die größte davon ist , dass, oft werden Datenbanken eng gekoppelt und jeder Tisch hat eine Fremdschlüsselbeziehung mit zumindest einer anderen Tabelle. Aus diesem Grund kann es unmöglich sein, eine Datenbank in n Unterdatenbanken zu partitionieren, die von n Mikrodiensten gesteuert werden .
Ich frage also: Wie kann man bei einer Datenbank, die ausschließlich aus verwandten Tabellen besteht, diese in kleinere Fragmente (Gruppen von Tabellen) denormalisieren, damit die Fragmente von separaten Mikrodiensten gesteuert werden können?
Zum Beispiel angesichts der folgenden (eher kleinen, aber beispielhaften) Datenbank:
[users] table
=============
user_id
user_first_name
user_last_name
user_email
[products] table
================
product_id
product_name
product_description
product_unit_price
[orders] table
==============
order_id
order_datetime
user_id
[products_x_orders] table (for line items in the order)
=======================================================
products_x_orders_id
product_id
order_id
quantity_ordered
Verbringen Sie nicht zu viel Zeit damit, mein Design zu kritisieren, ich habe dies spontan getan. Der Punkt ist, dass es für mich logisch sinnvoll ist, diese Datenbank in drei Microservices aufzuteilen:
UserService
- für CRUDding-Benutzer im System; sollte letztendlich den[users]
Tisch verwalten; undProductService
- für CRUDding-Produkte im System; sollte letztendlich den[products]
Tisch verwalten; undOrderService
- für CRUDding-Aufträge im System; sollte letztendlich die[orders]
und[products_x_orders]
Tabellen verwalten
Alle diese Tabellen haben jedoch Fremdschlüsselbeziehungen miteinander. Wenn wir sie denormalisieren und als Monolithen behandeln, verlieren sie ihre gesamte semantische Bedeutung:
[users] table
=============
user_id
user_first_name
user_last_name
user_email
[products] table
================
product_id
product_name
product_description
product_unit_price
[orders] table
==============
order_id
order_datetime
[products_x_orders] table (for line items in the order)
=======================================================
products_x_orders_id
quantity_ordered
Jetzt kann man nicht mehr wissen, wer was, in welcher Menge oder wann bestellt hat.
Ist dieser Artikel also ein typisches akademisches Hullabaloo oder gibt es eine praktische Anwendbarkeit für diesen Denormalisierungsansatz, und wenn ja, wie sieht er aus (Bonuspunkte für die Verwendung meines Beispiels in der Antwort)?