【问题标题】:Saving Customer Orders to the database and ensuring integrity of that order is preserved将客户订单保存到数据库并确保保留该订单的完整性
【发布时间】:2014-07-09 10:15:43
【问题描述】:

在我的 Rails 应用程序中,我需要存储客户订单,以便店主以后仍然可以参考订单。

我担心在订单完成后,店员可能需要在一段时间后更改价格或细节或产品。

假设产品仅通过product_id 链接到订单,这将损害最终订单的完整性。

常见的管理方法是什么?

我能想到的一个选项是,在幕后不允许更新产品。如果工作人员执行“更新”,则在幕后旧记录将被标记为“旧”,并在其位置创建新产品。

另一种选择可能是将哈希值存储在产品的订单模型中,因为它出现在交易发生的日期。

这样做有什么好处和坏处?是否有其他可能性我应该考虑作为设计认可的模式来处理这个问题?

【问题讨论】:

  • 你不认为产品和订单之间的关系应该是多对多的,因为一个产品可以在多个订单中,而订单有多个产品。如果您采用多对多方法,那么您可以在加入表中保存每个产品的价格 w.r.t 订单
  • @Abk 谢谢。你说得很好……我在把问题放在一起时忽略了这个细节。我已经更新了评论问题,但我认为它不会改变我的要求,只是它确实打开了在链接表中保存数据的可能性。也就是说,我要确保保留的不仅仅是价格数据,它可能是任何东西。他们需要查看交易发生时产品的“外观”,无论此后发生了什么变化。

标签: ruby-on-rails database design-patterns model integrity


【解决方案1】:

两种最常见的方法是

  • 按下订单时的状态存储所有值,并
  • 存储值更改的历史记录,以便可以根据订单日期重新创建它们。

因此,如果您存储所有值,订单的订单项表可能如下所示。 (订单日期不在此表中。)您可能还需要存储计算值,例如扩展价格(数量 * 单位价格)、销售税等。

order_num 数量单位 product_code product_name unit_price -- 10132 每个 5 个 13376-A 小部件 $1.99 10132 2 打 BR549 菲姆贝尔 $24.99 10132 3 盒 THRUM Thrums $8.99

如果您存储计算值,请使用验证以确保它们与基值保持同步。

如果您要存储历史记录,产品表可能如下所示。 (价格更改一次;名称更改一次。)

product_code product_name unit_price units from_date to_date -- 13376-A 小部件 $1.99 每个 2014-01-01(NULL 或 END_OF_TIME) 13376-A 小工具 每个 1.95 美元 2012-02-13 2014-12-31 13376-A Wid-每个 1.95 美元 2009-06-17 2012-02-12 ...

行项目表将存储产品代码。日期将在订单表中。基于 line_items.product_code 和 orders.order_date 的连接将从该历史表中获取正确的详细信息。 END_OF_TIME 是您的 dbms 支持的最大日期值。

无论哪种情况,您都需要认真考虑何时以及如何允许对表进行更新。 (因为,今天打印的订单10132,一定和他们下单时打印的一样。)

在许多情况下,系统允许更改订单项。相反,他们使用补偿性订单项。如果有人订购了 5 打 fimbels,而他们打算订购 6 打,系统将不允许您将 5 更改为 6。相反,它只会为 1打 fimbels 添加另一个订单项。 (或者它会出现让您将 5 更改为 6,而是存储一个补偿行项目。)

【讨论】:

    猜你喜欢
    • 2021-11-16
    • 1970-01-01
    • 2015-05-15
    • 2023-03-13
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多