代码之家  ›  专栏  ›  技术社区  ›  Gabriel Solomon

电子商务不同的购物车项目数据库和模型设计

  •  1
  • Gabriel Solomon  · 技术社区  · 15 年前

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

    现在我有一些东西: 分贝

    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
    

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

    4 回复  |  直到 7 年前
        1
  •  3
  •   queen3    15 年前

    你应该在谷歌上搜索继承映射“,这一切都归结为 choices:

    • 单个表:每个类层次结构的表,在此方案中,一个类erarchy的类都映射到一个表。
    • joined:每个子类都有一个表,在这个策略中,每个子类都有自己的表。要从数据库中检索对象,将联接超类和子类表。这也适用于子类的子类。
    • 表每类:表每类,每个具体类存储在自己的表中。所有属性(包括继承的)都映射到具体类的表中。

    选择取决于具体的需求——性能与简单性等。

        2
  •  0
  •   timdev    15 年前

    一种方法是简单地创建一个产品模型,类似于书籍和研讨会。所以书籍和研讨会的每个记录都有一个产品参考。

    就您的购物车代码而言,您主要关心的是产品ID、标题和价格。

    您的目录代码更关心差异,但是您处理书籍浏览/显示的方式与处理研讨会注册的方式不同。但两者都有产品ID,所以如果您的用户“添加到购物车”中,您只需告诉购物车“添加产品ID 123”。对左连接和条件进行一点巧妙的思考,可以使购物车很容易地计算出任何给定产品ID的标题和成本,而不管其类型如何。

    希望这有帮助。

        3
  •  0
  •   Noah Goodrich    15 年前

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

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

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

    您的基本项类应该实现一组多态接口,这些接口将返回正确的值,如项名称、项描述,但在不同的子类中需要不同的实现。

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

    您的购物车和订单类也应该如此。他们应该能够与产品和研讨会进行交互,而不必执行任何上下文处理。

        4
  •  -1
  •   iangraham    15 年前

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

    在您的购物车模型中,您可以只使用get-product()方法返回产品ID、标题和价格。 在用于在目录中实际显示产品的模型中,您还可以使用get-product()方法(或get-product属性($product id))方法,但可以使用tim建议的左联接返回products表和attributes表中的值。