数据库多对多建表与Java小技巧

E-R总图:

先判断是什么关系:

1)一个用户能对应多个订单,而一个订单只能对应一个用户,所以是一对多的关系(不需要中间表:在多方加外键)

2)一个订单可以有多个商品,一个 商品也能出现在多个订单上,所以是多对多的关系(需要中间表,外键都在中间表(多方)        出现)

分析:

先确定三张基本表,user、product、order
分析用户user、商品product、订单order三者关系
1、user和order是一对多关系,其中user是一,order是多,即每个user可拥有多个order,而每个order只能属于一个user。一对多关系的两张表建立关联,不需要额外创建中间表,只需在多的一方表中增加外键列,将一的一方主键引入即可。
结论:user表不需改动,order表额外增加外键列uid


2、order和product是多对多关系,多对多关系的两张表建立关联,需要创建中间表将之拆分成两个一对多关系。
新建订单项表orderItem记录订单项,每行记录一个订单项。
product和orderItem是一对多关系,其中product是一,orderItem是多,即每个product可属于多个orderItem,而每个orderItem只能包含一个product。需要在多的一方,即orderItem表增加外键列pid。
order和orderItem是一对多关系,其中order是一,orderItem是多,即每个order可包含多个orderItem,而每个orderItem只能属于一个order。需要在多的一方,即orderItem表增加外键列oid。
结论:新建订单项表orderItem,额外增加两个外键列pid和oid

注意:如:一个订单可以有商品,此时如果在订单表中多个商品明显不符如

          订单号1   用户名  时间 商品1 价格

          订单号1   用户名  时间 商品2 价格

此时用关联表解决


最终设计:
建立四张表user(主键uid)、product(主键uid)、order(主键oid,外键uid)、orderItem(主键Itemid,外键pid和oid)

java中的实体类设计:

如上面的表:

用户类:
 

Class User{
private Long id;

private String username;

private String password;
}

方式一:中间表额外属性较少时,偷懒方式。

商品类:

Class Product{
private Long id;
private String name;
private BigDecimal price;
private int count;
}

订单类:

中间表属性较少时:(此时订单一对多,所以在此用List,由于关联表下有count,所以只能在product类中加上count)

Class Order{
private Long id;
private Long number;
private Date createTime;
private User user;
private BigDecimal price;
private List<Product> products;
}

方式二:这种方式需要创建中间表实体类,理解上比较好,但查数据库表时可能比较麻烦

创建中间表类:

​
Class OrderDetail{
private Long id;
private Order order;
private Product product;
private int count;
}

商品类:

Class Product{
private Long id;
private String name;
private BigDecimal price;
}

订单类:

Class Order{
private Long id;
private Long number;
private Date createTime;
private User user;
private BigDecimal price;
private List<OrderDetail> otderDetails;
}

此时注入时orderDetails时可以不传入Order类成员,只需要Product即可,因为orderDetails存在时Order必存在,所以这个字段可以删去 。

猜你喜欢

转载自blog.csdn.net/qq_37431224/article/details/103920662