最近做项目的时候遇到一个这样的问题,一个表中由四个字段都是一对多的关系。如果把四个字段放入到一张表中,肯定存在很多冗余数据。想想那怎么办呢?分成四张表,用主外键关联起来,但太不灵活了。想到考试系统中用到的中间表,想这里也可以用到。现在比较
最近做项目的时候遇到一个这样的问题,一个表中由四个字段都是一对多的关系。如果把四个字段放入到一张表中,肯定存在很多冗余数据。想想那怎么办呢?分成四张表,用主外键关联起来,但太不灵活了。想到考试系统中用到的中间表,想这里也可以用到。现在比较一下三种建表方式的不同之处吧!
1、 表:字段包括粮仓、前置机地址、端口、组、数据,其中粮仓、前置机地址可以唯一标识
2、关系:
(1)一个粮仓容纳多个前置机
(2)一个前置机对应多个端口
(3)一个端口对应多个组
3、假设:
(1) 1号仓中有前置机1和2;
(2)前置机1、2各有2个端口;
(3)每个端口对应的组不同;
1、方法一:将所有字段放到一张表中
仓 |
前置机 |
端口 |
组 |
数据 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
2 |
2 |
1 |
1 |
2 |
3 |
3 |
1 |
1 |
2 |
4 |
4 |
1 |
2 |
1 |
5 |
5 |
1 |
2 |
1 |
6 |
6 |
1 |
2 |
2 |
7 |
7 |
1 |
2 |
2 |
8 |
8 |
1 |
2 |
2 |
9 |
9 |
大家可以看到,把所有字段放在一张表中,产生很多冗余字段。这仅仅一个仓有9组的情况下,仓和前置机、端口就产生了很多冗余数据,那如果说一个仓有10个前置机、20组呢?
优点:代码简单
缺点:产生很多冗余数据
2、方法二:建立四张表(仓表、前置机表、端口表、组和数据表)
(1)粮仓表
仓表(主键) |
1 |
(2)前置机表
前置机(主键) |
仓表(外键) |
1 |
1 |
2 |
1 |
(3)端口号表
端口 |
前置基表(外键) |
1 |
1 |
2 |
1 |
1 |
2 |
2 |
2 |
(4)组表
组(主键) |
数据 |
端口号(外键) |
1 |
1 |
1 |
2 |
2 |
1 |
3 |
3 |
1 |
4 |
4 |
1 |
5 |
5 |
2 |
6 |
6 |
2 |
7 |
7 |
2 |
8 |
8 |
2 |
9 |
9 |
2 |
优点:减少冗余,查找方便(建立主外键)
缺点:不灵活(如果某个前置机坏了,进行更换,我必须更改前置机表和端口表)
通过主外键联系,操作时会涉及到多张表,耦合性太强。
方法三、建立中间表,解耦和
(1)粮仓表
仓序号 |
仓表 |
1 |
1 |
(2)前置基表
前置机序号 |
前置机 |
1 |
1 |
2 |
2 |
(3)端口表
端口序号 |
端口 |
1 |
1 |
2 |
2 |
3 |
1 |
4 |
2 |
(4)组表
组序号 |
组号 |
数据 |
1 |
1 |
1 |
2 |
2 |
2 |
3 |
3 |
3 |
4 |
4 |
4 |
5 |
5 |
5 |
6 |
6 |
6 |
7 |
7 |
7 |
8 |
8 |
8 |
9 |
9 |
9 |
(5)仓与前置机的中间表
序号 |
仓序号 |
前置机序号 |
1 |
1 |
1 |
2 |
1 |
2 |
(7)前置机与端口中间表
序号 |
前置机序号 |
端口序号 |
1 |
1 |
1 |
2 |
1 |
2 |
3 |
2 |
1 |
4 |
2 |
2 |
(8)端口表与组表的中间表
序号 |
端口序号 |
组序号 |
1 |
1 |
1 |
2 |
1 |
2 |
3 |
2 |
3 |
4 |
2 |
4 |
5 |
1 |
5 |
6 |
1 |
6 |
7 |
2 |
7 |
8 |
2 |
8 |
9 |
2 |
9 |
优点:减少冗余、增加灵活性
通过中间表建立联系,操作时 无论是前置机、端口、组,还是具体的某个数据出现问题,我们更改时不需要更改两张基本表。