我正在一个在线商店网站上工作。 我需要制作一个购物车。
我很困惑,为了制作购物车,我必须在我的数据库中制作一个购物车表(具有customer_id,product_id,数量,价格(。 然后当客户结帐购物车时,我必须制作另一个表(订单(来存储签出的订单?? 然后我必须制作 2 张桌子,一张用于存放购物车,一张用于在结账时存储订单?
将签出顺序存储在数据库中是合乎逻辑的(因为它不需要太多更新......
但。。将购物车存储在数据库中是否有效?想象一下,每当客户将商品添加到购物车时,我必须使用 INSERT 查询,然后当客户增加数量或减少时,我必须使用 UPDATE 查询,然后当客户删除购物车 DELETE 查询时...... 知道通常客户多次添加到购物车,然后在不结账的情况下删除。也许改变了主意?
什么是合乎逻辑的解决方案??
感谢您的帮助
这取决于您的业务。如果您的业务需要;
- 如果用户未登录到您的网站,您可以将本地存储保存在他们的cookie中。
- 如果用户经过身份验证,您可以从cookie获取所有购物车并保存到您的数据库中
- 如果没有登录付款,那么您不必在用户的cookie和数据库之间移动它们。
- 如果用户可能从多个平台登录,并且您想统一购物车,那么您需要将购物车保存在您的数据库(mysql 或任何其他数据库(中。
您可以使用其他数据库技术,例如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>