2009-09-27 50 views
1

我有一个电子商务网站,有2种类型的产品:书籍&研讨会参与。 它们是不同的,并且具有不同的属性。 我很好奇,你怎么会在数据库和模型模拟这种(因为你不能继承多类)电子商务不同的购物车项目数据库和模型设计

现在,我有这样的事情: 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 

为模型我有a

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 

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

+0

你可以看看使用多态关联。基本上存储相关项目的类型和ID。购物车将有[“产品”,5]或[“研讨会”,19]等 – 2012-12-27 11:04:32

+0

看看rails如何处理类级别实现示例的多态连接。 – 2012-12-27 11:05:07

回答

3

你应该谷歌的继承映射”,这一切都归结到这些choices:

  • SINGLE_TABLE:表每类层次结构,在这种情况下一个类erarchy的类都被映射到一个表。
  • 加入:。表,每个子类,在这一战略的每个子类都会有它自己的表检索从超和子类表都加入了对数据库中的对象这也适用于子类的子类
  • TABLE_PER_CLASS :table-per-class,每个具体类都存储在它自己的表中operties(包括继承)映射到具体类的表。

的选择取决于具体的要求 - 性能与简洁等

+0

+1对于如何思考问题的良好的普遍反应 – timdev 2009-09-27 20:54:55

0

一种方法是简单地创建一个产品模型,像书籍和研讨会的参考资料。因此,书籍和研讨会的每个记录都有一个product_id引用。

就您的购物车代码而言,您大多只关心product_id,标题和价格。

您的目录代码更关注差异,但是您处理书籍的浏览/显示方式与您在研讨会注册时的不同。但两者都有产品ID,因此如果用户“添加到购物车”,则只需告诉购物车“add product id#123”。对LEFT JOIN和条件的一点思考应该让购物车很容易找出任何给定产品ID的标题和成本,而不管它的类型如何。

希望这会有所帮助。

+0

所以你sugesting有一个单一的表?否则我不知道该ID是否适用于产品或研讨会 – 2009-09-27 19:13:00

+0

三个表格:产品,书籍,研讨会。产品包含任何共享数据(标题,价格等)。书籍和研讨会表格包含特定的内容,并且有一个product_id。 SELECT * FROM产品LEFT JOIN研讨会LEFT JOIN书籍WHERE product_id = 123基本上可以满足您的任何需求。您可能必须在显示代码中执行一些条件编码,但以单向方式处理书籍应该相当容易,而为了显示目的而研讨另一种方法,而为了购物车逻辑的目的,将其视为相同。 – timdev 2009-09-27 20:52:34

-1

在你的数据库中你不能只有两个表,一个是产品(id,type,price,title),然后是属性(id,product_id,attribute,description)? 通过这种方式,您可以在产品与属性之间建立一对多关联。

在您的购物车模型中,您可能只有一个get-product()方法,它将返回产品ID,标题和价格。 在您的模型中,您可以使用get-product()方法(或get-product-attribute($ product-id))方法实际显示产品目录中的产品,但会返回产品表中的值并建议将tim join的属性表作为tim。

+0

我想了解它..但这会使选择复杂化很多,例如搜索和过滤,我担心它会影响性能并使代码更复杂以保持 – 2009-09-27 19:15:07

+0

EAV被正确地视为反垃圾邮件,数据库设计中的模式。 – 2009-09-27 22:50:21

+0

@NoahGoodrich我不是说我同意答案,但你可以浏览EAV上的维基http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model - 不是一个提到它是“反模式”。这是一个选择,就像数据建模中的许多其他人一样。 – 2012-12-27 10:59:32

0

你有没有考虑你的遗传模式可能存在缺陷?

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

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

您的基础商品类应实现一组多态接口,这些接口将返回适当的值,例如商品名称,商品描述,但需要不同子类中的不同实现。

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

它应该与您的购物车和订单类同样。他们应该能够与产品和研讨班进行互动,而无需执行任何上下文处理。

相关问题