关系型数据库表与表之间的设计

本贴最后更新于 2005 天前,其中的信息可能已经时移世异

关系型数据库表与表之间一般存在三种关系:

  1. 一对一
  2. 多对一(如:老师与学院)
  3. 多对多(如:老师与学生)

下面分别就三种关系讲解数据库相关设计的思路和思考过程:

# 一对一关系(少见)

建立一个父表和一个子表,最好将数据量多的作为子表,内有自己 id 号作为主键,并有父表的主键(id)做为外键。

# 多对一关系

各建立两张表,多端表指向另一张表(即多指向一),同时多端表中加上外键约束。

例 1:每个教师只担任一门课的教学,一门课由若干教师任教。“教师”有属性:职工号,教师姓名,职称,“课程”有属性:课程号、课程名。

解析:由题目可知,需要创建两张表:教师表和课程表,其关系为多对一,则教师表为子表,课程表为父表,教师表指向课程表(多指向一)。

E-R 图如下(使用 PowerDesigner15.1 绘制):
E-R 图
建表语句如下:
建表语句

# 多对多关系

方法一:选择一张表作为父表,另一张作为子表,在子表中添加外键。建表语句与例 1 中相似,就不做过多赘述。
方法二:在建立两张基本信息表的同时,建立一个中间表,这个中间表通过两个 id 映射作为一个多列索引来表达两个表的数据关系。

例 2:一个产品由多种零件组成,一种零件也可装配出多种产品。产品有产品号和价格,零件有零件号、重量和价格。
方法二:需要创建三张表:零件表、产品表和关系表。
E-R 图如下:
E-R 图
建表语句如下:
建表语句

# 总结

表中行的信息是通过 id(主键)来标识的,多表的关系总是通过建立一个各个表的 id 映射(外键)来表达,这个映射表有时比较简单,就把它包含到其要映射的一个表中(如多对一关系表);而比较复杂时就需要单独提取出来(如多对多关系表),当然也可以不提取出来,但是那样设计会产生很多冗余空间,占用我们硬盘。把表分开节约空间,把表合并节约时间,具体表该怎么设计最终还是要看需求。

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...