购物车中order_id外键为空正常吗?

问题描述 投票:0回答:1

有以下实体:

员工

  • employee_id(主键)
  • 名字
  • 姓氏

客户

  • customer_id(主键)
  • 名字
  • 姓氏
  • 登录
  • 密码

产品

  • 产品 ID (主键)
  • 产品名称
  • 类型
  • 价格
  • 库存单位

订单

  • order_id(主键)
  • 员工_id
  • 完成日期

购物车商品

  • customer_id(客户的主键和外键参考)

  • product_id(产品的主键和外键引用)

  • order_id(订单的外键引用(可以为空!))

  • 数量

    在我的应用程序中,我为客户提供以下逻辑: 今天客户将一些产品添加到他的购物车(使用他的 UI),然后 如果他决定这样做,他就会向员工核对订单。 而且,如果他决定这样做,他今天就不会结账, 但明天他只想看看他的购物车并决定其他事情等等。

    基本实现: 要查看某个客户的购物车,我们只需执行以下查询:

    SELECT * FROM Cart_items WHERE customer_id = some AND order_id IS NULL;
    要查看某个客户的订单历史记录,我们只需执行第二个:
    SELECT * FROM Cart_items WHERE customer_id = some;

主要问题是:

“Cart_items 的 order_id 中可以包含 NULL 值吗? 什么时候没有创建订单?” 我的意思是:

  1. 它是最佳的,还是有更好的方法来组织数据库中的表结构?;
  2. 这个结构满足三种范式吗?.

我看到了这个主题:外键可以为 NULL 和/或重复吗?。 但没有提到形成购物车结构。

sql ddl shopping-cart
1个回答
0
投票

设计或多或少还可以。然而现在,看起来

cart_items
依赖于
orders
,但这并不完全正确。如果需要扩展用例以包含运输信息,则在
shipping_id
中包含
cart_items
会显得很奇怪。

通常购物车是用户放置想要购买的物品的临时场所。一旦他决定继续购买,就会使用购物车中的商品创建订单,然后清空购物车。

在同一个表中混合订购的商品和购物车商品并不是一个好方法。购物车物品需要快速访问,因此桌子的尺寸不宜太大。从长远来看,存储订购的商品和购物车商品肯定会对性能产生不利影响。购物车商品也会受到删除操作,而订购的商品永远不会被删除,应用程序中的一个简单错误也可能会删除订购的商品。


更好的方法是有一个单独的表

order_items
来跟踪订单的项目。

订单商品

  • 订单商品 ID (PRIMARY_KEY)
  • product_id(产品的外键引用)
  • order_id(订单的外键引用)
  • 数量

订单不能单独存在,在

customer_id
中包含
orders
才有意义。

订单

  • order_id(主键)
  • customer_id(外键参考客户)
  • 员工_id
  • 完成日期

虽然表格

cart_items
只是用户购物车中的商品。

购物车商品

  • customer_id(客户的主键和外键参考)
  • product_id(产品的主键和外键引用)
  • 数量
© www.soinside.com 2019 - 2024. All rights reserved.