【问题标题】:Insert new record when updating information?更新信息时插入新记录?
【发布时间】:2011-11-29 07:03:49
【问题描述】:

我正在开发在线购物车系统,我有 items 和 item_options 表。

每个项目可以有 1 个或多个选项,见下文。

项目表

  • item_id (PK)
  • item_name
  • item_description

注意:物品价格在 item_options 表中

item_options 表

  • option_id (PK)
  • item_id (FK)
  • 选项名称
  • option_price

当客户下单时,数据会添加到order和order_items表中。

订单表

  • orders_id (PK)
  • customer_id (FK)
  • address_address_id (FK)
  • 购买日期
  • orders_status
  • orders_date_finished

order_items 表

  • orders_items_id (PK)
  • orders_id (FK)
  • item_id (FK)
  • item_option_id (FK)

有一个问题,如果员工更改价格、商品名称或删除商品.. 客户发票将受到影响,因为来自 order_items 的 FK 将不再存在于 items 表中。有什么办法解决这个问题?

这个解决方案怎么样:在itemsitem_options 表中添加活动字段。当员工想要更改商品的价格或名称时 - 只需将当前活动记录变为 0 (items.active),然后插入一条带有新信息的新记录,活动变为 1。旧订单仍然指向正确的 id不活动的条目。这是好方法吗?

在 items 表中插入新信息后,是否意味着我必须更新/更改 item_id.item_options 表中的新 PK ID?

【问题讨论】:

    标签: mysql database database-design


    【解决方案1】:

    在这种情况下,我绝对反对使用硬删除。每次更新或删除都应该在 item_options 表中添加一个新行,然后将前一行标记为非活动(这样用户就不可能选择以前的值之一)。

    插入的每个新项目都应包含两个步骤:

    1. 将项目添加到项目表中
    2. 使用 items 表中的 item_id,将项目添加到 item_options 表中

    【讨论】:

    • 谢谢。关于第 2 点。即使我没有更改选项名称或价格...我仍然需要先获取 option_name 和 option_price 的值?然后用新的 item_id 插入到 item_options 中?
    • 是的,我相信您需要这样做,因为这现在与新记录(项目)相关联。除非我没有正确理解你的问题......
    • 我将重新解释我的问题以确保:) 如果我仅更改 items.item_name 和 items.item_description 的值.. 即使我这样做了,我仍然需要在 item_options 表中添加新记录不更改 item_options.option_price 的值?
    • 这取决于。现有销售的名称应该更改还是不应该更改?如果他们不应该这样做,那么是的,您需要复制该数据,尽管它没有更改,因为 item_id 现在已更改。但是,如果您不介意值更改 (item_name),那么您只需对其进行更新,而无需重新插入该数据。
    • 谢谢你的信息,有没有做类似工作的开源购物车?
    【解决方案2】:

    我见过的典型解决方案是将您想要历史记录的数据的快照存储在单独的表中。这样一来,您就可以只存储发票时需要快照的数据,而不是特定表中的所有数据。

    在简化代码中的报告和查询时,它还有助于将历史数据与实时数据分开存储。通常这两个东西不需要同时访问,因此您可以避免更复杂的查询(以及单个表上较重的负载)只是为了访问一个或另一个。

    【讨论】:

    • 这不是一个坏主意。如果我理解正确,我需要创建新表:history_items、history_item_options?要为客户显示过去的订单,首先检查当前项目表中的数据,如果未找到 item_id,则检查 history_items.item_id?
    • 实施的具体细节取决于您的业务规则,但我见过的 1 个场景仅存储可能发生变化的事物的历史数据(如价格),以及对项目 ID。特定的项目定义数据(目录号等)不太可能改变或发生变化(实际上可以使其不可更改),因此您不必每次都存储它。这也使您可以灵活地在项目定义之外应用特定于发票的价格调整(系统覆盖、折扣代码调整等),以便发票价格与项目定义无关。
    • 除上述之外还有一点需要注意。在这种情况下,您不会删除不再支持的项目,只需将它们标记为“已删除”或“已过期”并将它们保留在系统中以便旧发票可以参考。
    【解决方案3】:

    如果你打算按照你描述的方式做事,你将不得不在 item_options 表中添加一个新行来处理新项目。

    【讨论】:

    • 如果我只更改 item.name,为什么我必须向 item_options 添加新行?如果我更改 item_options.option_price 中的价格 - 这是否意味着我必须在 items 表中添加新行?这是最好的解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 2019-09-12
    相关资源
    最近更新 更多