数据库术语“关系”或“关系”描述表格中数据的连接方式。
数据库领域的新手往往很难看到数据库和电子表格之间的差异。 他们看到数据表并认识到数据库允许您以新的方式组织和查询数据 ,但未能掌握数据之间关系的重要性,这些关系为关系数据库技术提供了名称。
通过关系可以用强大的方式描述不同数据库表之间的关系。 这些关系可以用来执行强大的跨表查询,即连接。
数据库关系的类型
有三种不同类型的数据库关系,每种关系都根据关系中可能涉及的表行数进行命名。 这三种关系类型中的每一种都存在于两个表之间。
- 当第一个表中的每个条目在第二个表中只有一个对应项时,会发生一对一关系 。 一对一关系很少使用,因为将所有信息简单地放在一张表中通常会更高效。 一些数据库设计者通过创建包含另一个表中数据子集的表来充分利用这种关系。
- 一对多关系是最常见的数据库关系类型。 它们发生在表A中的每条记录对应表B中的一条或多条记录时,但表B中的每条记录仅对应于表A中的一条记录。例如,小学教师表和学生表之间的关系数据库可能是一对多的关系,因为每个学生只有一位老师,但每位老师都有多个学生。 这种一对多的设计有助于消除重复的数据。
- 当表A中的每条记录对应表B中的一条或多条记录时,会出现多对多关系 ,表B中的每条记录对应表A中的一条或多条记录。例如,教师与课程表格可能是多对多的,因为每个教师可以指导多于一门课程,每门课程可能有一个以上的教师。
自我参照关系:特例
当只涉及一个表时,自引用关系就会发生。 一个常见的例子是雇员表,其中包含有关每位员工的主管的信息。 每位主管也是一名雇员,并有自己的主管。 在这种情况下,存在一对多的自引用关系,因为每个员工都有一个主管,但每个主管可能有多个员工。
使用外键创建关系
通过指定一个外键,可以在表之间创建关系。该键告诉关系数据库这些表是如何关联的。 在许多情况下,表A中的列包含从表B引用的主键。
再次考虑教师和学生表格的例子。 Teachers表格只包含一个ID,一个名称和一个课程列:
InstructorID | 老师的名字 | 课程 |
---|---|---|
001 | John Doe | 英语 |
002 | 简Schmoe | 数学 |
Students表包含一个ID,名称和一个外键列:
学生卡 | 学生姓名 | Teacher_FK |
---|---|---|
0200 | 洛厄尔史密斯 | 001 |
0201 | Brian Short | 001 |
0202 | 科基·门德斯 | 002 |
0203 | 莫妮卡琼斯 | 001 |
Students表中的Teacher_FK列引用了Teachers表中教师的主键值 。
通常,数据库设计人员将在列名称中使用“PK”或“FK”来轻松识别主键或外键列。
请注意,这两个表格说明了教师和学生之间的一对多关系。
关系和参照完整性
一旦将一个外键添加到表中,您就可以创建一个数据库约束来强制两个表之间的参照完整性 。 这确保了表格之间的关系保持一致。 当一个表具有指向另一个表的外键时,参照完整性的概念指出,表B中的任何外键值都必须引用表A中的现有记录。
实现关系
根据您的数据库,您可以通过不同的方式实现表格之间的关系。 Microsoft Access提供了一个向导,可轻松让您链接表格并强制执行参照完整性。
如果您直接编写SQL,则应首先创建表Teacher,并将ID列声明为主键:
CREATE TABLE教师(
InstructorID INT AUTO_INCREMENT PRIMARY KEY,
Teacher_Name VARCHAR(100),
课程VARCHAR(100)
);
在创建Students表时,您将Teacher_FK列声明为引用Teachers'表中InstructorID列的外键:
CREATE TABLE学生(
StudentID INT AUTO_INCREMENT PRIMARY KEY,
Student_Name VARCHAR(100),Teacher_FK INT,
FOREIGN KEY(Teacher_FK)参考教师(InstructorID))
);
使用关系来加入表格
一旦在数据库中创建了一个或多个关系,就可以通过使用SQL JOIN查询来合并来自多个表的信息,从而充分发挥其功能。 最常见的连接类型是SQL INNER JOIN或简单连接。 这种类型的联接从多个表中返回满足联接条件的所有记录。 例如,此JOIN条件将返回Student表名中的外键与Teachers表中的主键相匹配的Student_Name,Teacher_Name和Course:
SELECT Students.Student_Name,Teachers.Teacher_Name,Teachers.Course
从学生
INNER JOIN教师
ON Students.Teacher_FK = Teachers.InstructorID;
这个语句产生一个如下所示的表格:
从SQL连接语句返回表
Student_NameTeacher_NameCourseLowell SmithJohn DoeEnglishBrian ShortJohn DoeEnglishCorky MendezJane SchmoeMathMonica JonesJohn DoeEnglish