【问题标题】:Relationship between Customer and Order in a Shopping Cart购物车中客户与订单的关系
【发布时间】:2011-08-03 02:52:13
【问题描述】:

我正在制作 ERD,以便构建我的购物车。

我对订单和客户之间的关系感到困惑。

如果我没记错的话,一个客户可以订购很多产品,

一个客户可以下单

所以

Create Table OrderProduct(
orderProductId int PRIMARY KEY,
productID int,
Quantity int
)

Create Table Orders( 
OrderId int PRIMARY KEY,
orderProductId int, //foregin key
CustomerId int,
date
)

我是正确的,还是 mu 表结构错误?

【问题讨论】:

    标签: sql database database-design entity-relationship shopping-cart


    【解决方案1】:

    Order 表有一个列orderProductId - 这没有任何意义;如果您考虑一下,这意味着Order 将有一个OrderProduct

    OrderProduct 表应该有一个列,OrderId - 与Order 表的主键相关的外键。这样你就可以有 10 个OrderProduct 记录(通常称为订单行)用于同一个订单。

    对于这些问题,我发现模拟一些测试数据会有所帮助 - 如果可行,您会很快看到。

    【讨论】:

    • 还值得记录下订单行的价格——这样,当标的产品价格发生变化时,您就不会得到不一致的数据。
    • @Neville - 是的,更多的是业务需求,尽管这需要相关的考虑。如果出现定价错误,或者用户添加到他们的购物车并且随着时间的推移价格显着上涨等等。
    • 确实——尽管我建议区分“购物车”和“订单”——两者是相似的,但并不完全相同。我认为您希望确保您对客户下的订单有一个不可变的反映,即使其中包括定价错误。
    【解决方案2】:

    这里是关于购物车的简单而略带异端的建议。

    table cart(
       customer_id not null
      ,create_date not null
      ,primary key(customer_id)
      ,foreign key references customers(customer_id) on delete cascade
    );
    
    table cart_item(
       customer_id   not null
      ,product_id    not null
      ,quantity      not null
      ,modified_date not null
      ,primary key(customer_id, product_id)
      ,foreign key(customer_id) references cart(customer_id) on delete cascade
      ,foreign key(product_id)  references products(product_id) on delete cascade
    );
    

    以下是设计背后的基本原理:
    如果您正在构建的东西看起来像大多数购物网站,那么每个客户一次只会有 0-1 个活动购物车。因此,购物车可以继承客户密钥。
    通常,一个人不会购买 2 次产品。相反,一个人购买了 2 件相同的产品,所以我将产品键作为 Cart Item 表中主键的一部分。

    要么客户决定不继续处理他购物车中的东西。在这种情况下,购物车和物品只会留在桌子上,直到他回来并决定继续付款,或者直到您决定(例如基于 cart.create_date)是时候删除数据了.

    当客户进行结帐并完成订单时,您可以创建真实的订单和订单行(产品),包括订单日期,不一定与客户开始将商品放入购物车的日期相同。 (我在亚马逊上购买的书通常需要一周时间才能完成,因为我一直在寻找有趣的书,而且我必须先阅读一些评论 :)

    至于你的订单/订单表应该有什么键,它实际上取决于很多事情,例如:

    • 是否可以删除有订单的产品?
    • 您是否需要准确表示购买时的产品信息(价格、名称)?
    • 我是否使用订单行表来表示其他内容,例如折扣/活动代码等
    • 我是否需要准确报告购买时的客户送货地址? (客户搬到了另一个国家,但你把物品寄到了他的老地方)

    上述设计使用自然键,在这种情况下恰好提供了出色的性能。

    【讨论】:

      【解决方案3】:

      这对我来说似乎很好,但是您需要 OrderProduct 表中的 OrderId 才能将订单详细信息链接到订单 - 从 Orders 中删除 OrderProductId。

      其他一些列,如 ProductId 和 CustomerId,当然也应该是外键。

      “订单”是最终订单还是有后续的开票步骤?因为您通常可能希望锁定订单中的单价(来自订单时的产品文件,或者可能来自已签署/批准的报价单)。

      【讨论】:

        【解决方案4】:

        一个订单可以有多个产品。您可以从 OrderProuct 表中删除 orderProductId,并将 productId 作为主键。还可以在 OrderProduct 表中将 OrderId 作为外键,以便您可以在 Order 和按相应顺序排列的产品。

        【讨论】:

        • -1 ProductId 应该只是产品表的主键。 ProductId 不应该是 OrderProduct 表的主键,这是非常错误的。
        • (例如,整个系统上只有一个客户/用户/订单当时能够在他们的购物车中拥有产品)
        • OrderProduct 表也是一个只包含产品的表。所以应该有一种方法来跟踪这个表。所以我建议 productId 应该是那里的主键。
        • OrderProduct 不仅仅包含产品,它显然与订单有关 - 它是订单行表,包含与特定订单相关的产品列表。
        猜你喜欢
        • 2018-03-01
        • 2013-12-13
        • 1970-01-01
        • 1970-01-01
        • 2012-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-29
        相关资源
        最近更新 更多