一、前言

在数据库设计中,hibernate,iBatis等ORM框架的使用中经常听说主键,外键,主表,从表,关联表,父表,子表之类的术语,弄懂它们之前的区别与联系对于数据库设计和ORM框架的学习使用是非常有必要的。

二、概述

下面从数据库设计角度,ORM框架使用(以Hibernate为例),PowerDesigner软件以及实际业务角度进行一下介绍。

(1) 数据库角度而言

主键:一般情况下,满足第一范式的表都有一个主键Primary key,用于唯一标示数据库中的一个字段。

外键:外键是相对于数据库设计中的参考完整性而言,它与主键之间是彼此依赖的关系。假设现在有两个表,产品分类表ProductCategory(主键CategoryId)和产品信息表Product(主键ProductId),每类产品都属于一个分类。那么如果产品信息表肯定需要参考产品分类表进行定义。因为如果没有产品分类表,又何谈产品分类呢。所以产品信息表Product需要引用ProductCategory中的主键CategoryId 进行产品分类定义,Product表中引用CategoryId的字段就是外键。

在概念模型(Concept Model)中,从产品分类角度看,产品分类和产品之间就是一对多的关系,一个分类下可以有多个产品。从产品角度看,产品和产品分类之间是多对一的关系,多种产品属于一个分类。

主表:在数据库中建立的表格即Table,其中存在主键(primary key)用于与其它表相关联,并且作为在主表中的唯一性标识。(摘自百度百科)

从表:以主表的主键(primary key)值为外键 (Foreign Key)的表,可以通过外键与主表进行关联查询。从表与主表通过外键进行关联查询。(摘自百度百科)

关联表:两个数据库及其(数据)表之间的数据的相互依赖和影响关系。

比如现有某学校三个数据表:学生(学号,姓名),课程(课程名,课程编号),选课(学号,课程号,成绩)。选课表中的“学号”,“课程号”必须是另外两个表中存在的数据,才有意义;而且一旦另外两表中的某一学生或课程被删除,选课表中的相应学号或课程号必须自动删除。这就是一种关联关系。它实际上是保证数据完整性的一种做法.

父表,子表的说法其实在PowerDesigner中解释可能更加恰当,这里就不多说了。

(2)从ORM框架来看

Hibernate的主表从表请参照:

https://www.iteye.com/problems/31280

关联表: 在Hibernate的关联关系中,存在着多对多的关联,但是实际情况下,我们是很少使用多对多关联的,因为它的查询效率很低(https://zhidao.baidu.com/question/244432511.html)。

举个例子,一个订单可以订多个产品,一个产品也可以出现在多张订单。很明显,一个多对多的关系,因为效率问题,我们必须将它分解成两个1对多的关系,所以,必须添加一个中间表,也就是关联表,用来保存两个表的主键,从而实现多对多关系的分解。

(3)PowerDesigner

一个截图,足以说明一切了,多的也不用举例,上面的单词相信大家还是可以看懂的。

【数据库】主键,外键,主表,从表,关联表,父表,子表_多对多

(4)实际业务功能

关于这个业务功能,不多介绍了,从网上截取了一个不错的例子,大家可以看一下,介绍的非常不错。

班级:Class 学生:Student

Class的表结构

id int identity,

name varchar

Student

id int identity,

name varchar,

classId int refrence Class ('id')

Student 中classId引用Class,一个班级中可能有多个学生,那么此时可以说Class是主表,Student是Class的从表,从hibernate的角度看,Student和Class是一个many-to-one的关系。

不过主表和从表是相对的,没有绝对的,比如,老师和学生的关系,一个老师有多个学生,一个学生同时也有多个老师,这时如果以老师为主表,那学生就是从表,一学生为主表,那老师就是从表。

如何确定主表和从表?

则完全取决于业务,业务上的主体就是主表,比如软件A是为老师而设计,用于管理学生的,那老师就是主表,软件B是为家长设计,用于管理老师的,那学生就是主表。主表和从表没有绝对,完全取决业务上的重心。

相信看了上面的介绍,大家都这些概念也大致的所有了解了。把这些基本概念弄懂对于学习ORM框架是非常重要的。

主从表是一种数据关系模型,主表约束从表。以学员信息表stuInfo和考试成绩表stuMarks为例, 我们知道它们是一对多的关系,当然一是主,多是从。(譬如我们的胡主席是主,我们大家都要听主席的话!)所以stuInfo就是主表,stuMarks就是从表。那么,一般我们会在从表中做一个外键字段,引用主表中的主键。(为什么呢?大家想想是13亿人民记住主席的名字容易还是主席记住13亿人民名字呢?)这一点,已经在stuMarks表中得到了体现。那么,为了保持数据的完整性。主从表我们要尽量遵循以下原则:

1、当主表中没有对应的记录时,不能将记录添加到子表 ——成绩表中不能出现在学员信息表中不存在的学号;

2、不能更改主表中的值而导致子表中的记录孤立 ——把学员信息表中的学号改变了,学员成绩表中的学号也应当随之改变;

3、子表存在与主表对应的记录,不能从主表中删除该行 ——不能把有成绩的学员删除了;

、删除主表前,先删子表 ——先删学员成绩表、后删除学员信息表。