高内聚

  • 把相关的字段放在一起,不相关的分开建表(第三范式)
  • 如果两个字段能够单独建表,那就单独建表(第二范式)

    低耦合

  • 如果两个表之间有弱关系

  • 一对一可放在一个表,也可两个表外加键
  • 一对多一般用外键
  • 多对多一般建中间表

一对一

假设一个学生只能加入一个班级

可以把班级放在学生表里

学生表 (一个学生只能有一个id)

学生id 姓名 班级id
1001 小明 4002
1002 小方 4002

班级表

班级id 名称
4002 入门1班

也可以单独建立关联表

中间建一个表 让他们关联起来

学生表

学生id 姓名
1001 小明

学生班级表(单独建立的关系表)

id 学生id 班级id
2003 1001 4002

班级表

班级id 名称
4002 入门1班

一对多

假设一个作者能写多本书

把书放在作者表里

某些DBMS支持数组,可以存两个id到一个字段

作者id 姓名 books
1001 大牛 [2001,3002]

2001,3002为书的编号
但是,如果DBMS不支持数组,就不能这样做了

单独建立关系表(推荐)

作者表

作者id 姓名
1001 大牛

出版表 (单独建立的关系表)

id 作者id 书id 出版社id
2001 1001 4002 902
2002 1001 4003 766

书表

书id 名称
4002 JS入门
4003 起飞

多对多

假设一个学生可以加入多个班级
当然每个班级可以有多个学生

把班级放进学生表里

  • 某些DBMS支持数组就可以放
  • 如果不支持数组,就不能放

单独建立关系表(推荐)

学生表

学生id 姓名
1001 小明

学生班级表(单独建立的关系表)

id 学生id 班级id 有效期
2001 1001 4002
2002 1001 4003

(有效期 指毕业了就删了之类的)

班级表

班级id 名称
4002 入门1班

什么时候建关联表

当关联自身存在属性时

  • 比如关联的有效期,有效期为一年
  • 比如关联的级别,店铺会员分为vip1~6

:一个店铺有多个会员,一个会员可以有多个店铺,它们之间的关系可以分等级,同样是这个店铺的会员,可以分vip1和vip6