product: name description category productVariants: productId productName sku price
如果product表中的产品名称发生更改,应使用什么方法来反映productVariants表中的更改?我应该使用原子事务吗?或者我应该在msg队列中推送事件,然后在productVariants上设置侦听器,以反映变化?
product
productVariants
b4wnujal1#
首先,您不应该对数据进行反规范化,因此productVariants表中不应该有productName。对于显示,我建议您查询产品变体,在获得响应后立即显示它们,然后对于每个变体,异步查询并按其id显示产品。理想情况下,设置一些缓存以避免一次又一次地查询同一产品。如果你想简化你的前端代码,那么在你的微服务和前端之间添加一个GraphQL层,并使用GraphQL聚合产品变体和产品(GraphQL将为你做请求和缓存)。现在,如果你想进行交叉查询,例如,如果你想通过价格和相关产品的类别来查找产品变体,那么你必须设置一个物化视图。就像你建议的那样,你的products和productVariants微服务在每次修改时都会发出消息。实体化视图使用这些消息来保持自身处于最新状态。设置实体化视图可能看起来很复杂,但它可以控制一切:你可以将规范化的数据修改到两个微服务中,视图是只读的。你可以有你想要的复杂的视图,它仍然不会是一个混乱。
productName
products
1条答案
按热度按时间b4wnujal1#
首先,您不应该对数据进行反规范化,因此
productVariants
表中不应该有productName
。对于显示,我建议您查询产品变体,在获得响应后立即显示它们,然后对于每个变体,异步查询并按其id显示产品。理想情况下,设置一些缓存以避免一次又一次地查询同一产品。如果你想简化你的前端代码,那么在你的微服务和前端之间添加一个GraphQL层,并使用GraphQL聚合产品变体和产品(GraphQL将为你做请求和缓存)。
现在,如果你想进行交叉查询,例如,如果你想通过价格和相关产品的类别来查找产品变体,那么你必须设置一个物化视图。就像你建议的那样,你的
products
和productVariants
微服务在每次修改时都会发出消息。实体化视图使用这些消息来保持自身处于最新状态。设置实体化视图可能看起来很复杂,但它可以控制一切:你可以将规范化的数据修改到两个微服务中,视图是只读的。你可以有你想要的复杂的视图,它仍然不会是一个混乱。