2009-07-03 110 views
0

我有两个表,一个叫做“cart”,一个叫做“items”。现在我希望购物车能够存储“物品”和数量的列表。因此,我创建了另一个表“cart_items”,其中包含模板ID,商品ID和数量的字段。SQL/PHP:表设计问题

这是很好的设计,或者我应该添加一个字段为“cart_item”的ID?或者有更好的方法来一起做这件事吗?当我尝试更新我的购物车时,我只是遇到了麻烦,我的购物车项目没有正确更新。我所要做的就是删除全部附加到购物车的“cart_items”,然后重新添加每个“cart_item”,我不禁想到必须有更好的方法来做到这一点。

回答

2

这是非常好的设计。

在ER(实体关系)方面有物品和车之间的许多一对多的关系。我的意思是一件物品可以出现在许多不同的手推车中,一辆手推车可以包含许多不同的物品。在这种情况下,“许多”的意思是“一个可以超过一个的可变数字”。

你cart_items表是所谓连接表,你需要它的许多一对多的关系进行建模。添加数量字段也是有道理的,因为将其放在cart_items上。

你有两个选择,当涉及到的关键:

  1. 制作(cart_id,ITEM_ID)主键。这被称为复合主键;或
  2. 创建一个名为id的自动增量字段。如果你这样做(cart_id,item_id)一个唯一的索引来强制唯一性。

两种选择是有效的。我个人更喜欢(2)。你也应该在(item_id,cart_id)上有一个唯一的索引。

1

我不确定你的桌子看起来到底如何,但是像下面这样的东西会是一个好的开始。

Items 
+-- ID --+-- Description --+-- Etc --+ 
|  1| Good item here | Buy one.| 
|  2| Another item | somethin| 


Cart 
+-- Cart ID --+-- Item ID --+-- Amt --+ 
|   1|   1|  4| 
|   1|   2|  3| 

每个车都有一个唯一的ID,与存储在其自己的行每个项目。通过这种方式,您可以一次添加或移除一个项目,同时保持项目链接,并且同时从一个购物车中选择所有项目。

1

一个指针我会给你的,而不是直接连接推车的项目,您复制从项目的所有relavent信息到另一个表,可能cart_Items,并链接到购物车。这很有用,因此您可以随时维护添加到购物车的内容。除非这些只是快速扔掉只需要一个会话的购物车,否则您希望能够确切了解该人在该时间点放入购物车的历史记录,并且不会在有人的购物车数据发生变化时决定改变有关物品的内容,或者在物品被删除时让物品消失。

1

正如前面所解释的,你所做的是正确的。 唯一缺少的是在你的数据库中使用DELETE CASCADE和FOREIGN KEYS

这时候你删除CART一排它会转到CART_ITEM也删除方式。

+0

你能解释一下这些是如何工作的吗? – MackDaddy 2009-07-04 01:44:30