【发布时间】:2015-01-16 09:51:48
【问题描述】:
我刚刚在Microservices and 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
现在无法知道谁订购了什么、数量多少或何时订购。
那么这篇文章是典型的学术喧嚣,还是这种非规范化方法在现实世界中有实用性,如果有,它是什么样子(在答案中使用我的示例的奖励积分)?
【问题讨论】:
-
WRT "疯狂地去规范化" 。 . .为什么?我在文章中没有看到任何具体的理由。
-
您是否正在解决这个问题?似乎是任何推动微服务的人最容易避免的问题之一。
-
你好@ccit-spence - 请看我的回答,让我知道你的想法。我必须自己设计这个解决方案,它已经运行了好几个月,但对其他开发人员的想法很感兴趣。
-
也许值得注意的是,这篇文章引用了一个甚至不支持外键约束的数据库(所以对我来说,这表明作者没有重视外键约束——也许没有'甚至不知道丢失了什么?)。
标签: database denormalization microservices