php - 数据库中购物车表和订单表之间的区别
问题描述
我正在开发一个在线商店网站。我需要做一个购物车。
我很困惑,为了制作购物车,我必须在我的数据库中制作一个购物车表(具有 customer_id、product_id、qty、price).. 然后当客户结账时,我必须制作另一个表( order) 存储已签出的订单??然后我必须做两张桌子,一张用来存放购物车,一张用来存放结账时的订单?
将签出顺序存储在数据库中是合乎逻辑的(因为它不需要太多更新..)
但是.. 将购物车存储在数据库中是否有效?想象一下,每当客户将商品添加到购物车时,我必须使用 INSERT 查询,然后当客户增加或减少数量时,我必须使用 UPDATE 查询,然后当客户删除购物车时,DELETE 查询......知道通常客户多次添加到购物车,然后在不结账的情况下删除.. 可能改变了主意?
什么是逻辑解决方案?
谢谢您的帮助
解决方案
这取决于您的业务。如果您的业务需要;
- 如果用户未登录您的网站,您可以将其保存在他们的 cookie 和本地存储中。
- 如果用户通过身份验证,您可以从 cookie 中获取所有购物车并保存到您的数据库中
- 如果没有登录付款,那么您不必在用户的 cookie 和数据库之间移动它们。
- 如果用户可能从多个平台登录并且您想统一购物车,那么您需要将购物车保存在您的数据库(mysql或任何其他数据库)中。
您可以使用其他数据库技术,例如redis
带有 expire 选项的哈希。它非常快,我认为它涵盖了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>
推荐阅读
- python - 使用事务插入数据时出现 NoReferencedTableError
- google-apps-script - Google Apps 脚本中的 setValues 非常慢
- thingsboard - 通过 API 调用从 ThingsBoard Dashboard 获取 .CSV 格式的 TimeSeries 数据
- acumatica - 从新屏幕复制到成本预算
- reactjs - 无法在 React 中访问数组索引
- rust - 如何使用 Clap 解析文件名?
- laravel - 如何在 github 操作中更改 .env 文件中的数据库变量?
- spring-boot - Spring Boot 基于来自外部库的自定义注解动态提供 String Bean
- angular - 组件中更新出错时的 RxJS 排序顺序
- .net - wix 使用发布构建而不是正常构建