数据库表的设计

1、一对一关系

子表中添加外键列关联父表的主键

2、一对多关系

一个实体可以关联多个其他实体实例,但每个实例只能属于一个父实体,在”多”的一方表中添加外键列关联”一”的一方的主键

3、多对多关系

创建中间表(关联表),包含两个外键分别关联两个表的主键

例子:电商系统

  1. 用户user
  2. 商品:product
  3. 订单:order

分析:

  1. 用户-商品:没有关系
  2. 用户-订单:一对多
  3. 商品-订单:多对多

各表初始设计:

  • 用户user
uid name age sex
1000 zhang 20 M
1020 liu 21 W
2010 wang 22 M
  • 商品product
pid pname price amount
1 手机 600.0 100
2 笔记本 2000.0 199
3 电池 10 200
  • 订单order
orderid uid pid number money totalprice addrinfo
O1000 1000 1 1 600 4640 海淀区
O1000 1000 2 2 4000 4640 海淀区
O1000 1000 3 4 40 4640 海淀区
O2000 1020 2 1 2000 2000 海南

在订单表的最初设计中,订单表的很多行的列内容都是相同的,如果要添加一个商品,就需要同时修改很多行的内容,如总价格这一列,每一行都要修改totalprice这一列,这就是数据冗余存储,一个操作会导致大面积的相同数据的大面积修改,我们不需要存同一份订单的多个uid,totalprice和addrinfo,这些信息只需要存放一次就足够了


由于于订单和商品是多对多关系,可以增加一张中间表orderlist,用于存放订单内容,下面是修改后,order表和orderlist表的设计

订单order

orderid uid totalprice addrinfo
O1000 1000 4640 海淀区
O2000 1020 2000 海南

订单内容orderlist

orderid pid number money
O1000 1 1 600
O1000 2 2 4000
O1000 3 4 40