数据库:一对一,一对多,多对多

一对一:就是说A表中的一条记录对应着B表的一条记录。大家可能会觉得这不是变得复杂了吗?其实不然,如果,当一张表的字段过于太多,而很多字段可能只有在某些情况下,才会使用到,这时也可以考虑使用一对一设计。

条件:建立单独的表就行了,

优点

1.   便于管理、可提高一定的查询速度

2.   减轻 CPU 的 IO 读写,提高存取效率。

3.   符合数据库设计的三大范式。

4.   符合关系性数据库的特性。

  缺点

1.   增加一定的复杂程度,程序中的读写难度加大

 

 一对多:顾名思义,A表一条数据对应B表多条数据。需要将A表主键作为B表的外键。

sql语句 :A :primary key (‘id’);(指定主键)

                B:FOREIGN KEY('B-id') REFERENCES  'A' ('id'); (将外键B-id和主键id关联)

多对多: 需要一张中间表来对应他们的关系。那么此时,A,B表并不需要其他的外键。只需各有自己的主键就行,就像一张单独的表一样。

因为需要一张单独的关系表来映射他们的关系。 

就比如这个:将orderid和productid作为联合主键。然后相互对应各自的外键。

有人可能就疑惑了,怎么这里设置了两个主键?

有必要讲下联合主键和复合主键了。

一、复合主键

  所谓的复合主键 就是指你表的主键含有一个以上的字段组成,不使用无业务含义的自增id作为主键。

比如 

 
  1. create table test

  2. (

  3. name varchar(19),

  4. id number,

  5. value varchar(10),

  6. primary key (name,id)

  7. )


上面的name和id字段组合起来就是你test表的复合主键 ,它的出现是因为你的name字段可能会出现重名,所以要加上ID字段这样就可以保证你记录的唯一性 ,一般情况下,主键的字段长度和字段数目要越少越好 。

这里就会有一个疑惑?  主键是唯一的索引,那么为何一个表可以创建多个主键呢?

其实“主键是唯一的索引”这话有点歧义的。举个例子,我们在表中创建了一个ID字段,自动增长,并设为主键,这个是没有问题的,因为“主键是唯一的索引”,ID自动增长保证了唯一性,所以可以。


此时,我们再创建一个字段name,类型为varchar,也设置为主键,你会发现,在表的多行中你是可以填写相同的name值的,这岂不是有违“主键是唯一的索引”这句话么?


所以我才说“主键是唯一的索引”是有歧义的。应该是“当表中只有一个主键时,它是唯一的索引;当表中有多个主键时,称为复合主键,复合主键联合保证唯一索引”。


为什么自增长ID已经可以作为唯一标识的主键,为啥还需要复合主键呢。因为,并不是所有的表都要有ID这个字段,比如,我们建一个学生表,没有唯一能标识学生的ID,怎么办呢,学生的名字、年龄、班级都可能重复,无法使用单个字段来唯一标识,这时,我们可以将多个字段设置为主键,形成复合主键,这多个字段联合标识唯一性,其中,某几个主键字段值出现重复是没有问题的,只要不是有多条记录的所有主键值完全一样,就不算重复。

二、联合主键

           联合主键顾名思义就是多个主键联合形成一个主键组合(主键原则上是唯一的,别被唯一值所困扰。)  

           联合主键的意义:用2个字段(或者多个字段,后面具体都是用2个字段组合)来确定一条记录,说明,这2个字段都不是唯一的,2个字段可以分别重复,这么设置的好处,可以很直观的看到某个重复字段的记录条数。

一个简单的例子 


主键A跟主键B组成联合主键 


主键A跟主键B的数据可以完全相同,联合就在于主键A跟主键B形成的联合主键是唯一的。 
下例主键A数据是1,主键B数据也是1,联合主键其实是11,这个11是唯一值,绝对不充许再出现11这个唯一值。(这就是多对多关系) 

复合主键是一个表中 用两个字段来确定数据唯一性

(这个是表中任意字段)

联合主键则是用两个或多个表中的主键组合起来确定数据唯一性

(这个是两个表的主键)

多对多中就是可以用联合主键。(因为两个键可以保证不重复)

猜你喜欢

转载自blog.csdn.net/BadRibbit/article/details/81735670
今日推荐