Я только что прочитал статью о Microservices и PaaS Architecture. В этой статье около трети пути вниз автор утверждает (под Denormalize like Crazy):
Схемы базы данных рефакторинга и де-нормализовать все, чтобы обеспечить полное разделение и разбиение данных. То есть не используйте базовые таблицы, которые обслуживают несколько микросервисов. Не должно быть общего доступа к базовым таблицам, которые охватывают несколько микросервисов и не используют общий доступ к данным. Вместо этого, если нескольким службам нужен доступ к тем же данным, он должен использоваться совместно с сервисным API (например, опубликованным REST или интерфейсом службы сообщений).
Хотя это звучит здорово в теории, в практичности у него есть серьезные препятствия для преодоления. Самым большим из них является то, что часто базы данных тесно связаны друг с другом, и каждая таблица имеет некоторые отношения с внешним ключом по меньшей мере с одной другой таблицей. Из-за этого невозможно было бы разбить базу данных на n подбатарей, управляемых n микросервисами.
Итак, я спрашиваю: Учитывая базу данных, которая полностью состоит из связанных таблиц, как ее можно денормализовать на более мелкие фрагменты (группы таблиц), чтобы фрагменты могли управляться отдельными микросервисами?
Например, учитывая следующую (довольно небольшую, но примерную) базу данных:
[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
Не тратьте слишком много времени на критику моего дизайна, я сделал это на лету. Дело в том, что для меня логично разбить эту базу данных на 3 микросервиса:
-
UserService
- для пользователей CRUDding в системе; должен в конечном итоге управлять таблицей[users]
; и -
ProductService
- для продуктов CRUDding в системе; должен в конечном счете управлять таблицей[products]
; и -
OrderService
- для заказов CRUDding в системе; должен в конечном итоге управлять таблицами[orders]
и[products_x_orders]
Однако все эти таблицы имеют отношения внешнего ключа друг с другом. Если мы денормализуем их и относимся к ним как к монолитам, они теряют все свое смысловое значение:
[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
Теперь нет способа узнать, кто заказал что, в каком количестве или когда.
Итак, эта статья типична для академического hullabaloo, или есть реальная практичность в этом денормализационном подходе, и если да, то каково это (бонусные баллы за использование моего примера в ответе)?