1、一对一关系
在子表中添加外键列关联父表的主键
2、一对多关系
一个实体可以关联多个其他实体实例,但每个实例只能属于一个父实体,在"多"的一方表中添加外键列关联"一"的一方的主键
3、多对多关系
创建中间表(关联表),包含两个外键分别关联两个表的主键
例子:电商系统
- 用户user
- 商品:product
- 订单:order
分析:
- 用户-商品:没有关系
- 用户-订单:一对多
- 商品-订单:多对多
各表初始设计:
- 用户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 |