当前位置:Gxlcms > mysql > 项目实战(二)—你的数据库灵活吗?

项目实战(二)—你的数据库灵活吗?

时间:2021-07-01 10:21:17 帮助过:38人阅读

最近做项目的时候遇到一个这样的问题,一个表中由四个字段都是一对多的关系。如果把四个字段放入到一张表中,肯定存在很多冗余数据。想想那怎么办呢?分成四张表,用主外键关联起来,但太不灵活了。想到考试系统中用到的中间表,想这里也可以用到。现在比较

最近做项目的时候遇到一个这样的问题,一个表中由四个字段都是一对多的关系。如果把四个字段放入到一张表中,肯定存在很多冗余数据。想想那怎么办呢?分成四张表,用主外键关联起来,但太不灵活了。想到考试系统中用到的中间表,想这里也可以用到。现在比较一下三种建表方式的不同之处吧!

一、实例

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

优点:减少冗余、增加灵活性

通过中间表建立联系,操作时 无论是前置机、端口、组,还是具体的某个数据出现问题,我们更改时不需要更改两张基本表。


人气教程排行