【问题标题】:Difference between cart table and order table in a database数据库中购物车表和订单表之间的区别
【发布时间】:2020-05-16 19:09:05
【问题描述】:

我正在开发一个在线商店网站。 我需要做一个购物车。

我很困惑,为了制作购物车,我必须在我的数据库中制作一个购物车表(有 customer_id,product_id,qty,price).. 然后当客户结帐时,我必须制作另一个表(订单)来存储签出的订单?? 那么我必须做两张桌子,一张用来存放购物车,一张用来存放结账时的订单?

在数据库中存储签出顺序是合乎逻辑的(因为它不需要太多更新..)

但是.. 将购物车存储在数据库中是否有效?想象一下,每当客户将商品添加到购物车时,我必须使用 INSERT 查询,然后当客户增加或减少数量时,我必须使用 UPDATE 查询,然后当客户删除购物车时,DELETE 查询...... 知道客户通常会多次添加到购物车,然后在不结账的情况下删除.. 可能改变了主意?

什么是合乎逻辑的解决方案??

感谢您的帮助

【问题讨论】:

  • 购物车不就是一个没有“结账”的订单吗?如果我去网上购物,装满购物车然后结帐,那么在我下次访问时,我希望我的购物车是空的,所以我认为购物车和订单是同一回事(所以,同一张桌子) - 但我不知道标准的购物车应用程序是不是这样!
  • 这正是我想知道的!购物车和订单是一样的吗?或者我们必须做两张桌子?您的意思是我们将结帐作为表格中的一列? @草莓
  • 事情是;订单完成后将等于购物车 - 订单不经常更新。这两个是不同的概念 - 在某些时候可能彼此相等。大部分时间订单为空,而购物车已更新。
  • 你能澄清更多吗? @Ersoy 没有得到你的答案
  • 购物车和订单是不同的概念。订单开始时为空,付款时订单存在。直到付款没有订单。付款完成后就没有购物车了。 “购物车”将被频繁访问、插入、更新,而“订单”将较少访问,一旦插入,“可能”会更新(返回等)。最好将它们保留为单独的概念。付款后它们可能彼此相等 - 在截断购物车之前。

标签: php mysql database


【解决方案1】:

这取决于您的业务。如果您的业务需要;

  • 如果用户未登录您的网站,您可以将其保存在他们的 cookie 和本地存储中。
  • 如果用户通过身份验证,您可以从 cookie 中获取所有购物车并保存到您的数据库中
  • 如果有免登录付款,那么您不必在用户的 cookie 和数据库之间移动它们。
  • 如果用户可能从多个平台登录,并且您想统一购物车,那么您需要将购物车保存在您的数据库(mysql 或任何其他数据库)中。

您可以使用其他数据库技术,例如带有 expire 选项的 redis 哈希。它非常快,我认为它涵盖了cart 的所有要求。

  • 使用会话标识符创建哈希
  • 使用 EXPIRE 设置生存时间(可能是 24 小时) - O(1)
  • 使用 HSET 添加产品及其数量 - 每个字段/值的 O(1)
  • 使用HINCRBY增加数量 - O(1)
  • 使用 HDEL 删除具有各自数量的产品 - 单个字段的 O(1)
  • 使用HGETALL 获取所有购物车。 - 字段数为 O(N)。
127.0.0.1:6379> hset user:somesessionidentifier:cart productid:2 5
(integer) 1
127.0.0.1:6379> expire user:somesessionidentifier:cart 86400
(integer) 1
127.0.0.1:6379> ttl user:somesessionidentifier:cart
(integer) 86394
127.0.0.1:6379> hset user:somesessionidentifier:cart productid:3 1
(integer) 1
127.0.0.1:6379> hset user:somesessionidentifier:cart productid:92 1
(integer) 1
127.0.0.1:6379> hset user:somesessionidentifier:cart productid:5 1
(integer) 1
127.0.0.1:6379> hgetall user:somesessionidentifier:cart
1) "productid:2"
2) "5"
3) "productid:3"
4) "1"
5) "productid:92"
6) "1"
7) "productid:5"
8) "1"
127.0.0.1:6379> HINCRBY user:somesessionidentifier:cart productid:2 1
(integer) 6
127.0.0.1:6379> HDEL user:somesessionidentifier:cart productid:5
(integer) 1
127.0.0.1:6379> hgetall user:somesessionidentifier:cart
1) "productid:2"
2) "6"
3) "productid:3"
4) "1"
5) "productid:92"
6) "1"
127.0.0.1:6379>

【讨论】:

  • 那么你的意思是我必须制作 2 个单独的表格(购物车和订单)?
  • 是的。你可以在你的mysql中保存订单。购物车将是一个临时的 - 订单将无限持续。由于购物车会经常被访问和更新,我提供了redis。 @T.AS
  • 好的。其实这是我第一次听说redis。我不知道我现在是否可以使用它。我有另一个建议,我可以在同一张桌子上制作购物车和订购吗?我在表中创建“ischeckedout”一列,如果订单已签出,则“ischeckedout”= 1,否则 = 0.. 当我需要获取有关订单和销售的数据时,我会从中检索数据条件为“ischeckedout”==1 .. 这是一个好的解决方案吗?它的负面影响是什么? @Ersoy
  • 如果由于购物车相关操作而对该表进行大量插入/更新/删除,也会影响“订单”。我不希望我的客户在某些人拥有超级活跃的购物车时看到他们的订单“非常缓慢”,因为他们共享同一张桌子。我不是电子商务专家,但我会将它们分开,因为一个是“临时的并且有生命周期”,而另一个是“无限的”。可以做到,但为了可扩展性,我不建议使用带有布尔标志的同一个表。正如我在开头所说的那样; “这取决于您的业务”及其规模。 @T.AS
  • 好吧好吧。另一个建议.. 难道购物车只是客户为了下订单而进行的一个瞬时过程,如果签出(数据被插入到订单表中),那么如果他没有结账,什么也不会发生。我的意思是我可以制作一个带有表格的购物车页面(从数据库中的产品表中检索价格,以及将提交的数量输入).. 一旦人添加到购物车,此页面将包含添加的数据产品,具有订购能力。如果客户没有下单,然后转到另一个页面,购物车将是空的。
猜你喜欢
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 2018-03-01
  • 2011-08-12
相关资源
最近更新 更多