Java-028-购物车实例

购物车数据模型

购物车数据模型

RESTful API

  • 用户 User: Create, List, Get, Update
  • 购物车 Cart: Create, List, Get, Update
  • 产品 Product: Create, List, Get, Update
  • 订单 Order: Create, List, Get, Update

数据模型

用户的订单 Order: List {product1, product2, product3, product4}

{order1 product1}

{order1 product2}

{order1 product3}

select * from orders where order_name = order1;

为每一个产品生成一个订单:

{order1 product1, 5}
{order2 product2, 1}
{order3 product3, 3}

从对象出发去思考我们的数据系统 (不要开始就想着表的结构)
对象有什么样的属性, 每个属性的语义是什么
对象与对象之间的关系
cart_item

1, user_1, product_1, 5
2, user_1, product_2, 1
3, user_1, product_3, 3
4, user_2, product_2, 1
5, user_2, product_2, 2

查看user_1的购物车里有什么?

select * from cart_item where user_id = user_1;

用户

数据对象:

User {
id: Integer primary key,
name: String not null,
password: String not null
//购物车, 购物车里的商品
}

关系数据库表 Schema:

CREATE TABLE user (
id INTEGER PRIMARY KEY NOT NULL,
name VARCHAR(20) NOT NULL,
password VARCHAR(255) NOT NULL,
);
购物车
数据对象:

Cart {
id: Integer primary key,
user_id: Integer not null
};

购物车的记录

CartItem {
id: Integer primary key,
cart_id: Integer not null,
user_id: Integer not null,
product_id: Integer not null,
quantity: Integer not null
}

这样就违反了范式二和范式三
cart:
cart_0, user_0, 1, 2

cart_item:
cart_0, user_0, product_0, 1
cart_0, user_1, product_1, 2

购物车中的记录
数据对象:

CartItem {
id: Integer primary key,
user_id: Integer not null, //哪个用户的购物车记录
product_id: Integer not null, //对应的产品
quantity: Integer not null, //对应的数量
}
关系数据库 Schema:

CREATE TABLE cart_item (
id INTEGER PRIMARY KEY NOT NULL,
user_id INTEGER NOT NULL,
product_id INTEGER NOT NULL,
quantity INTEGER NOT NULL
);
产品
数据对象:

Product {
id: Integer primary key,
name: String not null,
description: String not null,
price: Integer not null
}
关系数据库 Schema:

CREATE TABLE product (
id INTEGER PRIMARY KEY NOT NULL,
name VARCHAR(25) NOT NULL,
price INTEGER NOT NULL,
description VARCHAR(255) NOT NULL
);
订单
数据对象:

Order {
id: Integer primary key,
user_id: Integer not null,
product_id: Integer not null,
quantity: Integer not null,
status: String not null,
address: String not null
}
关系数据库 Schema:

CREATE TABLE order (
id INTEGER PRIMARY KEY NOT NULL,
user_id INTEGER NOT NULL,
product_id INTEGER NOT NULL,
quantity INTEGER NOT NULL,
status VARCHAR(25) NOT NULL,
address VARCHAR(255) NOT NULL
);

ORM 实体关系

示例:

  • 一个用户可以把多个产品的关注列表记录起来 (购物车), 一个用户可以有多个关注的产品. –> 一对多 和 多对一
  • 一个产品有一个产品的销售者, 对于产品来说, 那就 N个产品 –> 1个销售者, 对于销售者来说: 那就 1个销售者 –> 多个产品
  • 一对一: 博客系统: Post <--> PostDetail, 用户 <--> 购物车

一对一

例如: 一个购物车内的产品记录, 对应一个产品

记录 <--> 产品 ===> 是1 对 1的关系

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = “product_id”)
private Product product;
查询可以翻译成SQL语句:

一对多 和 多对一

例如: 一个用户会有多个放入购物车的记录

User:

User {
id: Integer primary key,
name: String not null,
password: String not null,
}
Cart:

Cart {
id: Integer primary key,
user_id: Integer not null,
product_id: Integer not null,
quantity: Integer not null,
}
Cart ORM:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = “user_id”)
private User user;
User ORM:

@OneToMany(cascade = CascadeType.ALL,
fetch = FetchType.EAGER,
mappedBy = “user”)
private List carts;
实例:

1 团队 –> n 队员

对于团队来说: OneToMany

一个团队里面有哪些队员?

对于队员来说: ManyToOne

一个队员属于哪个团队?

注意: SQL 范式!

代码链接