我正在寻求创建在线商店,因此我进入了数据库定义。我希望表格尽可能少,所以我将它们缩小到:
我进入以下架构:
逻辑流程如下:对于购物车中添加的每个产品,都会创建一个新的Cart_Item条目。但是Cart_Item条目需要填写引用Order表的外键,即cartItemOrderID。由于未创建任何订单,因此一开始必须为空。一旦用户将所有需要的商品添加到购物车中,他们就下订单,并创建一个新的Order,因此现在有了orderID。由于没有办法告诉他们当前用户已放置该订单ID,因此如何将其传递给Cart_Item表中的条目?
我缺少了一些巨大的东西,但是我无法动弹。
[为OrderStatus添加另一个表。 OrderStatus将包含有效值。
OrderStatus
-----------
OrderStatusID
OrderStatusName: New, Sent, Shipped, Completed, ...
Order
-----
OrderStatusId: FK OrderStatusId
这样,当用户在购物车中添加第一个商品时,创建一个OrderStatus设置为New的Order。这由您的应用程序处理。
[如果我理解正确,您想保留用户当前选择的产品,例如,他可以关闭会话并在以后恢复吗?如果不是这种情况,您可以在提交订单时存储订单的产品。
如果上述情况成立,并且考虑到用户一次不能处理多个订单,则可以使用两个这样的表(每个表的PK在虚线上方:]
[UserCart]
########################
# userId #
# productId #
# -------------------- #
# quantity #
########################
[OrderProduct]
########################
# orderId #
# productId #
# -------------------- #
# quantity #
########################
UserCart
代表用户购物车中当前的产品。
cartItemId
的人工PK不会为您提供任何帮助,同时会迫使您进行更多必要的检查以避免错误。 (UserId
,ProductId
)PK免费为您提供必要的约束。userId
的行,或者如果处理方式不同,则将数量设置为0)OrderProduct
代表用户已提交订单中包含的产品。当用户提交订单时,您将执行以下交易:
Order
表中插入新订单,从中获得orderId
OrderProduct
中插入一行。Product
表中查询价格。如果您在将来产品价格发生变化的情况下进行此操作,则将其保留在存储所有过去值的附加历史记录表之类的内容中会更合适。您可以找到更多详细信息herePS,在发布答案之前,我会要求您作一些澄清,但我没有所需的声誉。如果我做错了事,请在评论中告诉我。
回复评论
您说OrderProduct是所有已完成订单的表。
我没那么说。检查此样本数据,以便于理解:
##### User ######
| UserId | .... |
-----------------
| 1 | .... |
| 2 | .... |
########## Order ##########
| OrderId | UserId | .... |
---------------------------
| 1 | 1 | .... |
| 2 | 1 | .... |
| 3 | 2 | .... |
########## OrderProduct ##########
| OrderId | ProductId | Quantity |
----------------------------------
| 1 | 1 | 15 |
| 1 | 3 | 66 |
| 2 | 1 | 153 |
| 3 | 1 | 7 |
| 3 | 2 | 8 |
| 3 | 3 | 13 |
###### Product #####
| ProductId | .... |
--------------------
| 1 | .... |
| 2 | .... |
| 3 | .... |
| 4 | .... |
您的订单与您的产品具有多对多关系。更具体地说:
OrderProduct
表实现了这种多对多关系
然后,这是否会使Order表变得多余?提交购物车项目的订单时,我不能在OrderProduct表中生成新行吗?如果是这样,那么它将给我留下4张桌子,像这样。
也许上面的示例清除了一些内容。另外,我不了解您需要的表格越少越好,但是我认为对正确地建模需求没有太大帮助。链接中的ORDERPRODUCT
表是错误的。
orderId
PK代表什么?如果它只是每行的自动递增标识符,则表中包含的唯一信息是用户X有时订购了Y件产品Z。Order
表,date
和details
中拥有的所有其他数据。即使您愿意,也无法添加它们,因为您无法在其中识别订单,即使可以,您也必须为订单中的每个产品重复此数据。[我想如果删除表非常重要,并且您不需要存储其他订单信息,则可以省略Order
表并像OrderProduct
那样构造:
[OrderProduct]
########################
# OrderDatetime #
# UserId #
# ProductId #
# -------------------- #
# Quantity #
########################
在那种情况下,订单将由对(UserId
,OrderDatetime
)标识,但是仅由理论上来说,标识是指您没有具体的Order
实体要引用。它认为这不是一个好习惯,并且很可能无缘无故地使您在应用程序的其他方面更加艰难。
如果条目之间没有连接表,如何将条目从UserCart发送到OrderProduct?还是User表充当两者之间的中间人,从而使联接成为可能?
没有与您的问题相关的联接,您可以通过简单的select语句在用户的购物车中获得当前产品:
SELECT productId, quantity FROM UserCart WHERE userId = @userId
您可以根据需要使用数据,例如,您可以使用INSERT INTO SELECT语句查询所要查询的内容。
这取决于您如何使用UserCart表和您的业务需求,但是我认为最好只使用此表在UI中重新填充用户当前的购物车。分开执行提交订单的操作,并发送完整的产品列表以作为订单提交。