最佳答案
我刚读了一篇关于 微服务和 PaaS 体系结构的文章。在那篇文章中,大约三分之一的路程,作者说(在 像疯子一样去规范化下) :
重构数据库模式,并对所有内容进行反规范化,以允许完全分离和分区数据。也就是说,不要使用服务于多个微服务的底层表。不应该共享跨多个微服务的底层表,也不应该共享数据。相反,如果多个服务需要访问相同的数据,则应该通过服务 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
现在没办法知道谁订了什么,订了多少,什么时候订的。
那么,这篇文章是典型的学术喧嚣,还是这种非规范化方法在现实世界中的实用性,如果是这样,它看起来像什么(在答案中使用我的例子的额外加分) ?