我刚刚读了一篇有关微服务和PaaS体系结构的文章。在那篇文章中,作者大约说了三分之一,(在Denormalize像Crazy一样):
重构数据库架构,并对所有内容进行规范化,以允许数据的完全分离和分区。也就是说,请勿使用为多个微服务服务的基础表。不应共享跨越多个微服务的基础表,也不应共享数据。相反,如果多个服务需要访问相同的数据,则应通过服务API(例如已发布的REST或消息服务接口)进行共享。
从理论上讲,这听起来不错,但在实践中,有一些严重的障碍需要克服。其中最大的问题是,通常数据库是紧密耦合的,并且每个表与至少一个其他表都有某种外键关系。因此它可能是不可能的分区的数据库进Ñ通过控制子数据库Ñ微服务。
所以我问:给定一个完全由相关表组成的数据库,如何将其规范化为较小的片段(表组),以便可以由单独的微服务控制这些片段?
例如,给定以下(虽然很小,但示例)数据库:
[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
-用于在系统中添加用户;最终应该管理[users]
表;和ProductService
-对系统中的产品进行填充;最终应该管理[products]
表;和OrderService
-用于在系统中添加订单;最终应该管理[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
现在,无法知道谁订购了什么,什么数量或什么时间。
那么,本文是典型的学术性论文,还是这种非正规化方法在现实世界中是实用的?如果是,那么它看起来像什么(在答案中使用我的示例的加分点)?