电子商务不同的购物车项目DB&模型设计

时间:2009-09-27 11:54:15

标签: php design-patterns database-design e-commerce

我有一个电子商务网站,有两种类型的产品:books&研讨会参与。 它们是不同的,具有不同的属性。 我很好奇你将如何在数据库和模型中建模(因为你不能继承多个类)

现在我有类似的东西: 的 DB

products (id, name ....)
seminars (id, title, date ....)
cart (id, session_id ...)
cart (id, cart_id, type, id_model) the type is product OR seminar

对于模特我有一个

cart_item_abstract
cart_item_product -> cart_item_abstract
cart_item_seminar -> cart_item_abstract
cart_order_product -> cart_item_product
cart_order_seminar -> cart_item_seminar

但这意味着我必须复制订单对象所需的一些代码。

4 个答案:

答案 0 :(得分:3)

你应该谷歌继承映射“,这一切归结为这些choices:

  • SINGLE_TABLE:Table-per-class-hierarchy,在这种情况下,一个类层次结构的类都映射到一个表。
  • JOINED:Table-per-subclass,在这个策略中,每个子类都有自己的表。要从数据库中检索对象,需要连接超类和子类表。这也适用于子类的子类。
  • TABLE_PER_CLASS:table-per-class,每个具体类都存储在自己的表中。所有属性(包括继承)都映射到具体类的表。

选择取决于具体要求 - 性能与简单等等。

答案 1 :(得分:0)

一种方法是简单地创建一个产品模型,其中包括书籍和研讨会等参考。因此,书籍和研讨会的每个记录都有product_id参考。

就购物车代码而言,您大多只关心product_id,title和price。

您的目录代码更关心差异,但您处理书籍的浏览/显示方式与参加研讨会注册的方式不同。但两者都有产品ID,因此如果您的用户“添加到购物车”,您只需告诉购物车“添加产品ID#123”。对LEFT JOIN和条件进行一点巧妙思考应该可以让购物车轻松找出任何给定产品ID的标题和成本,无论其类型如何。

希望这有帮助。

答案 2 :(得分:0)

您是否认为您的继承模式可能存在缺陷?

我认为购物车可以包含一个或多个商品,并且一旦用户完成购买购物车中的所有商品,就会创建订单。因此订单同样包含多个项目。

考虑到这一点,您可以使用继承映射来创建一个表,该表包含项类型之间共有的所有值以及类型字段(研讨会,产品)。然后为每种类型创建一个表来保存唯一值。

您的基类项应该实现一组多态接口,这些接口将返回正确的值,例如Item Name,Item Description,但是在各个子类中需要不同的实现。

作为一个例子,我最近参与了一个项目,如果用户是管理员或雇主,我需要返回名称的用户名,如果用户是学生,我需要返回连接的名字和姓氏。我创建了一个返回适当值的函数_getName(),使用它的代码(在本例中为视图)不必进行任何上下文处理。

您的购物车和订单类也应如此。他们应该能够与Product和Seminar类进行交互,而无需执行任何上下文处理。

答案 3 :(得分:-1)

在你的数据库中你不能只有两个表,一个用于产品(id,类型,价格,标题)然后是属性(id,product_id,属性,描述)? 这样,您可以在产品与属性之间建立一对多的关联。

在您的购物车模型中,您可以拥有一个只返回产品ID,标题和价格的get-product()方法。 在您的模型中实际显示目录中的产品,您也可以使用get-product()方法(或get-product-attribute($ product-id))方法,但是返回products表中的值和带有左连接的属性表,如建议的那样。