【发布时间】:2018-01-29 17:50:03
【问题描述】:
对于多租户电子商务应用程序,我给出了以下 ER 架构:
Order has_many OrderProduct belongs_to Product belongs_to Price
使用 Ecto,很容易通过 Order 的变更集函数中的 cast_assoc(:order_product) 一次插入具有多个 OrderProduct 的 Order .
但由于 Product 和 Price 将来可能会被删除,我想另外存储 Price 的值和OrderProducts 中的数量(:price,:quantity)。
据我所知,我有以下选择:
- 在 OrderProduct 的变更集函数中,我可以获取 Product 并通过 Product 的 ID 加入 Price 和将 Price 的
:price添加为 OrderProduct 的更改。这将导致 N+1 个查询,因为我必须为 Order 中的每个 OrderProduct 执行该查询(在这种情况下可以,因为我只有有限的数量每个订单的产品)。但此外,我更愿意保留模式定义模块的 Repo。但最重要的是:我在多租户设置中使用了不同的架构,因此我需要知道 OrderProduct 的变更集函数中的prefix才能在正确的prefix上执行查询。 - 在我的
Orders模块中的架构定义之外迭代 OrderProducts 并将:price添加为 OrderProduct 变更集的更改:
%Order{}
|> Order.changeset(attrs)
|> iterate_order_products_and_map_price_change(tenant)
|> Repo.insert(prefix: tenant)
- 使用
Ecto.Multi先插入订单,然后我用额外的Ecto.Multi.run添加关系
我更喜欢第一个选项,因为在我看来这是最干净的方法。
- 对于这种情况还有其他或更好的选择吗?
- 是否也可以通过加入 Product 和 Price for OrderProduct 在架构外的插入中进行预加载?那么我就不会有
N+11.?
【问题讨论】:
标签: elixir phoenix-framework ecto