更新信息时插入新记录?

时间:2011-04-24 13:44:51

标签: mysql database database-design

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

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

项目表

  • item_id(PK)
  • ITEM_NAME
  • ITEM_DESCRIPTION

注意:商品价格位于item_options表

item_options表

  • option_id(PK)
  • item_id(FK)
  • OPTION_NAME
  • option_price

当客户下订单时,数据将被添加到订单和order_items表中。

订单表

  • orders_id(PK)
  • customer_id(FK)
  • address_address_id(FK)
  • date_purchased
  • 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?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

如果您要按照描述的方式执行操作,则必须在item_options表中添加新行以处理新项目。