2011-04-24 149 views
1

我正在开发在线购物车系统,我有物品和item_options表。更新信息时插入新记录?

每个物品可以有一个或多个选项,请参见下文。

项目表

  • 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
  • date_purchased
  • orders_status
  • orders_date_finished
(FK)

ORDER_ITEMS表

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

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

该解决方案如何:在itemsitem_options表中添加活动字段。当工作人员想要更改物品的价格或名称时 - 只需将当前活动记录变为0(items.active),然后插入一条新记录和新信息,并激活成为1.旧订单仍指向正确的不活跃的条目。这是做这件事的好方法吗?

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

回答

2

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

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

  1. 的项目添加到项目表
  2. 使用从项目表中的ITEM_ID,添加项目到item_options表
+0

谢谢。在关于数字2.即使我没有改变选项名称或价格...我需要获得option_name和option_price的价值第一?然后用新的item_id插入到item_options中? – user622378 2011-04-24 14:06:43

+0

是的,我相信你会需要,因为这是现在与新的记录(项目)链接。除非我不能正确理解你的问题... – judda 2011-04-24 14:12:45

+0

我会重新解释我的问题,只是为了确保:)如果我只改变items.item_name和items.item_description的值..我仍然需要添加新的记录item_options表,即使我没有改变item_options.option_price的值? – user622378 2011-04-24 14:31:21

2

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

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

+0

这不是一个坏主意。如果我理解正确,我需要创建新表:history_items,history_item_options?要显示客户过去的订单,请首先检查当前项目表中的数据,如果未找到item_id,请检入history_items.item_id? – user622378 2011-04-24 14:02:07

+0

实现的具体细节将取决于您的业务规则,但我所看到的1个场景仅存储可能会更改的事物(如价格)的历史数据,以及物品ID的参考。特定项目定义数据(产品目录#等)不可能在其发生变化或重要时发生变化(事实上可以使其不变),因此不必每次都存储它。这也使您可以灵活地应用项目定义之外的发票专用价格调整(系统覆盖,折扣代码调整等),以便发票价格不受限于项目定义。 – roberttdev 2011-04-24 14:15:22

+0

除上述内容外,还有一点需要注意..在这种情况下,您不要删除不再支持的项目,只需将它们标记为“已删除”或“过期”并将其保留在系统中,以便旧发票可以引用它们。 – roberttdev 2011-04-24 14:16:15

0

如果您要按照您描述的方式执行操作,您将不得不向item_options表添加新行以处理新项目。

+0

为什么我必须添加一个新的行到item_options如果我只改变item.name例如?如果我在item_options.option_price中更改价格 - 是否意味着我必须在商品表中添加新行?这是最好的解决方案吗? – user622378 2011-04-24 13:56:06

相关问题