Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 为什么在域模型中以不同的方式表示购物车和订单发票?_Design Patterns_E Commerce_Domain Driven Design_Shopping Cart - Fatal编程技术网

Design patterns 为什么在域模型中以不同的方式表示购物车和订单发票?

Design patterns 为什么在域模型中以不同的方式表示购物车和订单发票?,design-patterns,e-commerce,domain-driven-design,shopping-cart,Design Patterns,E Commerce,Domain Driven Design,Shopping Cart,我过去曾构建过一些购物车系统,但我总是将它们设计为最终订单发票只是一个标记为“已购买”的购物车。在购物车中添加/删除/更改项目的所有逻辑也是订单的逻辑。所有数据都存储在数据库中的相同表中。但这似乎不是设计电子商务网站的正确方法。。有人能解释一下在域模型中将购物车与发票分离的好处吗 在我看来,这将导致大量重复的代码、数据库中的一组额外表,并使系统在需要开始适应更复杂的订单时更难维护(例如为可能或可能不改变订单价格/可用性/发货时间的项目指定所选选项)。我假设我还没有看到曙光,因为我看到的每本书和其

我过去曾构建过一些购物车系统,但我总是将它们设计为最终订单发票只是一个标记为“已购买”的购物车。在购物车中添加/删除/更改项目的所有逻辑也是订单的逻辑。所有数据都存储在数据库中的相同表中。但这似乎不是设计电子商务网站的正确方法。。有人能解释一下在域模型中将购物车与发票分离的好处吗


在我看来,这将导致大量重复的代码、数据库中的一组额外表,并使系统在需要开始适应更复杂的订单时更难维护(例如为可能或可能不改变订单价格/可用性/发货时间的项目指定所选选项)。我假设我还没有看到曙光,因为我看到的每本书和其他例子似乎都将这两个看似相似的关注点分开——但我找不到任何解释来说明这样做的好处!我设计的系统中也存在这样的情况,即在确认初始订单后,通常会进行更改。事后(但在履行之前)移除、替换或添加项目并不少见

我刚想说的是,至少保持这种差异是好的,这样发票就不会改变,但我只是读了你的评论,事实上,在你的情况下,发票往往会改变?我想说,在那个阶段,它们仍然像是一张“订单”,而不是一张发票。将它们分开的原因之一可能是,您的购物车将引用可能更改的产品,而您不希望您的发票引用可能更改的产品(导致与发票创建日期/时间相比,在查看发票时描述不同的产品)


通过使用接口和/或继承,您应该能够只编程一次共享功能,但仍然保持发票和购物车分开。

我喜欢将其视为真实商店中发生的事情,在那里您有一个购物车,其中包含所有产品、选项、优惠券和其他有关您想购买的信息

订单表示有关订单的信息。。。付款方式、交易信息等。这只是“以下是我如何购买购物车的所有信息”的表示。这是您在登记和付款时提供的所有信息


我发现这是一种简单的方法来决定什么会发生,并提供了一个很好的模型来说明现实世界中的关联可能是什么。

在您的场景中,我认为您不想实际更改记录,而是对其应用更改。所以你会有记录显示价格变化。例如,如果加密狗的价格从10美元更改为15美元,则必须添加一条记录,指示价格变化为+5美元

分离记录和复制的全部目的是确保POS(销售点)的数据与现在的数据相同。如果不是,那么您可以很容易地看到定价发生了什么变化以及何时发生

假设你发布了一个售价25美元的小部件B,上面有一个Z-Dongle的描述。你后来从制造商那里听说它有一个X-加密狗,而不是一个Z-加密狗,因此你需要降低你的价格。在你发布和更正错误之间,有人花了25美元买了这个小部件


该客户在发现没有Z-Dongle后致电,希望退货并获得全额退款。但现在你有了他们的记录,显示他们用X-Dongle购买了一款产品,价格比最初支付的价格低15美元。客户服务代表告诉他,说明中明确说明它有一个X-Dongle-现在怎么办?

考虑到性能和订单转换率:

  • 密集存储数据可能会导致大量死锁。请考虑以下情况:当客户将货物放入购物车或仅查看购物车的货物列表时,我们的履行人员正在处理一些订单修改、物流、分配作业等。这可能会导致死锁

  • 高并发和低阶转换率会使情况变得更糟


  • 听起来你有一个很酷的模特;我想你花了很多时间和领域专家一起工作来解决这个问题?+1西蒙;我还想说(正如@chance所指出的),如果你能够改变事情,那应该会触发其他的工作流程。例如,在亚马逊,如果你订购了一些东西,并且订单中的任何东西在发货之前发生了变化&你收到了发票,你会收到一封关于它的电子邮件,并且它会处于挂起状态,直到你确认你可以更改。