数据非规范化如何与微服务模式一起使用?
我刚刚读了一篇有关微服务和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 …