数据库表之间的关系

1.简介


在设计数据库时,交流是一个相当重要的主题。根据我个人的经验,我会说,已经意识到了连接,对我来说,理解数据库规范化要容易得多

1.1。本文适用于谁?


对于那些想了解数据库表之间关系的人来说,本文将是有用的。在其中,我试图用通俗易懂的语言告诉它是什么。为了更好地理解该主题,我将理论材料与实际示例交替显示,以图表和查询的形式提供了所需的表格。我使用Microsoft SQL Server DBMS,并在T-SQL中编写查询。由于查询是通用的并且不使用特定的T-SQL构造,因此我编写的代码应可在其他DBMS上使用。

1.2。您如何应用这些知识?


  1. 创建数据库的过程对您来说将变得更加容易和易于理解。
  2. 了解表之间的关系将帮助您更好地理解规范化,这在设计数据库时非常重要。
  3. 处理外部数据库将容易得多。
  4. 在面试时,这将是一个很好的加分。

2.致谢


考虑了作者的建议和批评。 工作机会未填充弗宁哈马鲁巴
谢谢!

3.1。通信是如何组织的?


链接是使用外键创建的。
外键是引用另一个表的主键或唯一键的属性或属性集。换句话说,它类似于指向另一个表中某行的指针。

3.2。关系类型


链接分为:

  1. 多对多。
  2. 一对多。
    • 有强制性联系;
    • 可选通讯;
  3. 一对一。
    • 有强制性联系;
    • 可选通讯;

让我们详细考虑它们中的每一个。

4.多对多


想象一下,我们需要编写一个数据库,该数据库将由IT公司员工存储。同时,有一定的标准职位集。其中:

  • 一名员工可能有一个或多个职位。例如,某个雇员可以同时是管理员和程序员。
  • 一个职位可以“拥有”一个或多个员工。例如,管理员是一组特定的工作人员。换句话说,有些工人属于管理员。

员工由Employee表(id,名称,年龄)表示,职位由Position表(id和职位名称)表示。如您所见,这两个表之间的规则是多对多的:每个员工都有一个或多个职位(许多职位),每个职位对应一个或多个员工(许多员工)。

4.1。如何建立这样的表?


我们已经有两个表格来描述员工和职业。现在我们需要在它们之间建立多对多的关系。为了实现这种关系,我们需要在“雇员”表和“位置”表之间进行某种中介。在我们的例子中,它将是某个表“ EmployeesPositions”(工人和职位)。此中介表按以下方式链接员工和职位:
员工IDPositionId
1个1个
1个2
23
33
左边是员工(他们的ID),右边是职位(他们的ID)。此表上的员工和职位使用id'shniki表示。

可以从两个侧面查看此表:

  1. 因此,我们说id为1的员工在id为1的职位上。与此同时,请注意以下事实:表中id为1的员工有两个职位:1和2。也就是说,左边的每个员工对应于在右边的某个位置。
  2. 我们也可以说ID为3的帖子属于ID为2和3的用户。也就是说,右侧的每个员工在左侧都有特定的员工。

4.2。实作


图表


T-SQL代码
create table dbo.Employee
(
	EmployeeId int primary key,
	EmployeeName nvarchar(128) not null,
	EmployeeAge int not null
)

--   Employee .
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (1, N'John Smith', 22)
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (2, N'Hilary White', 22)
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (3, N'Emily Brown', 22)

create table dbo.Position
(
	PositionId int primary key,
	PositionName nvarchar(64) not null
)

--   Position .
insert into dbo.Position(PositionId, PositionName) values(1, N'IT-director')
insert into dbo.Position(PositionId, PositionName) values(2, N'Programmer')
insert into dbo.Position(PositionId, PositionName) values(3, N'Engineer')

--   EmployeesPositions .
create table dbo.EmployeesPositions
(
	PositionId int foreign key references dbo.Position(PositionId),
	EmployeeId int foreign key references dbo.Employee(EmployeeId),
	primary key(PositionId, EmployeeId)
)

insert into dbo.EmployeesPositions(EmployeeId, PositionId) values (1, 1)
insert into dbo.EmployeesPositions(EmployeeId, PositionId) values (1, 2)
insert into dbo.EmployeesPositions(EmployeeId, PositionId) values (2, 3)
insert into dbo.EmployeesPositions(EmployeeId, PositionId) values (3, 3)


说明
foreign key primary key unique .

  • PositionId EmployeesPositions PositionId Position;
  • EmployeeId EmployeesPositions — EmployeeId Employee;


4.3。结论


要实现多对多关系,我们需要在考虑中的两个表之间建立一个中介器。它必须存储两个外键,其中第一个引用第一个表,第二个引用第二个表。

5.一对多


这是数据库之间最常见的连接。在将多对多链接进行比较之后,我们考虑它。

假设我们需要实现一个记录用户数据的数据库。用户具有:姓名,姓氏,年龄,电话号码。此外,每个用户可以具有一个或多个电话号码(许多电话号码)。

在这种情况下,我们观察到以下情况:一个用户可以有许多电话号码,但是不能说一个特定的用户属于该电话号码。

换句话说,电话仅属于一个用户。用户可能拥有1个或多个电话(很多)。

如我们所见,这种关系是一对多的。

5.1。如何建立这样的表?


用户将由某个“人”表(id,名字,姓氏,年龄)表示,电话号码将由“电话”表表示。它看起来像这样:
电话号码人格电话号码
1个511 091-10
2519 124-66
31721 972-02
该表代表三个电话号码。在这种情况下,编号为1和2的电话号码属于ID为5的用户,但ID为3的数量属于ID为17的用户
注意如果“电话”表具有更多属性,我们可以安全地将它们添加到该表中。

5.2。我们为什么不在这里做中间表?


仅当我们具有多对多关系时,才需要中介表。出于简单的原因,我们可以从两个方面进行考虑。就像前面的EmployeesPositions表一样:

  1. 每个员工都有几个职位(很多)。
  2. 每个职位都属于几个雇员(许多)。

但是在我们的情况下,我们不能说每个电话都有多个用户-一个电话号码只能属于一个用户。
现在,再次阅读第5.1段末尾的注释。-对您来说,它将变得更加容易理解。

5.3。实作


图表


T-SQL代码
create table dbo.Person
(
	PersonId int primary key,
	FirstName nvarchar(64) not null,
	LastName nvarchar(64) not null,
	PersonAge int not null
)

insert into dbo.Person(PersonId, FirstName, LastName, PersonAge) values (5, N'John', N'Doe', 25)
insert into dbo.Person(PersonId, FirstName, LastName, PersonAge) values (17, N'Izabella', N'MacMillan', 19)

create table dbo.Phone
(
	PhoneId int primary key,
	PersonId int foreign key references dbo.Person(PersonId),
	PhoneNumber varchar(64) not null
)

insert into dbo.Phone(PhoneId, PersonId, PhoneNumber) values (1, 5, '11 091-10')
insert into dbo.Phone(PhoneId, PersonId, PhoneNumber) values (2, 5, '19 124-66')
insert into dbo.Phone(PhoneId, PersonId, PhoneNumber) values (3, 17, '21 972-02')


说明
Phone . ( Person). , : « ». , id .

6.一对一


想象一下,在工作中,您被赋予编写数据库以记录所有HR员工的任务。老板向公司保证,公司仅需要了解员工的姓名,年龄和电话号码。您开发了这样的数据库,并将其安置在公司的所有1000名员工中。然后老板说,由于某种原因,他们需要了解员工是否被禁用。想到的最简单的事情是在表中添加一个新的bool列。但是输入1000个值太长了,如果输入true,则输入的次数要比false少得多(例如,输入2%为true)。

一个更简单的解决方案是创建一个新表,我们称之为“ DisabledEmployee”。它看起来像这样:
DisabledPersonId员工ID
1个159
2722
3937年
但这不是一对一的关系。事实是,在这样的表中,可以多次输入雇员;因此,我们收到了一对多的关系:一个雇员可以被禁用多次。必须确保员工只能在表中输入一次,并且只能被禁用一次。为此,我们需要指出EmployeeId列只能存储唯一值。我们只需要在EmloyeeId列上施加唯一约束即可。此限制报告一个属性只能采用唯一值。

通过这样做,我们得到了一对一的关系。

笔记请注意,我们还可以对EmloyeeId属性施加主键约束。它与唯一性约束的不同之处仅在于它不能为null。

6.1。结论


可以说一对一关系是将同一张表分为两部分。

6.2。实作


图表


T-SQL代码
create table dbo.Employee
(
	EmployeeId int primary key,
	EmployeeName nvarchar(128) not null,
	EmployeeAge int not null
)

insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (159, N'John Smith', 22)
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (722, N'Hilary White', 29)
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (937, N'Emily Brown', 19)
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (100, N'Frederic Miller', 16)
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (99, N'Henry Lorens', 20)
insert into dbo.Employee(EmployeeId, EmployeeName, EmployeeAge) values (189, N'Bob Red', 25)

create table dbo.DisabledEmployee
(
	DisabledPersonId int primary key,
	EmployeeId int unique foreign key references dbo.Employee(EmployeeId)
)

insert into dbo.DisabledEmployee(DisabledPersonId, EmployeeId) values (1, 159)
insert into dbo.DisabledEmployee(DisabledPersonId, EmployeeId) values (2, 722)
insert into dbo.DisabledEmployee(DisabledPersonId, EmployeeId) values (3, 937)


说明
DisabledEmployee EmployeeId, . EmployeeId Employee. , unique, , . , .

7.强制性和可选性沟通


关系可以分为强制性和可选性。

7.1。一对多


  1. 一对一,具有强制联系:
    许多士兵属于一个团。一架战斗机仅属于一个团。请注意,任何士兵都必须属于一个团,没有士兵就不可能存在一个团。
  2. 一对一的连接(可选):
    所有人都生活在地球上。每个人都只生活在地球上。此外,没有人类就可以存在一个星球。因此,在地球上找到我们是可选的

可以将相同的关系视为强制性和可选性。考虑以下示例:
一位亲生母亲可以生很多孩子。一个孩子只有一个亲生母亲。
A)女人不一定有自己的孩子。因此,通信是可选的。
B)孩子必须只有一个亲生母亲-在这种情况下,需要沟通。

7.2。一对一


  1. 一对一,具有强制性联系:
    某个国家/地区的一位公民必须仅拥有该国家/地区的一本护照。一本护照只有一个持有人。
  2. 一对一,带有可选链接:
    一个国家只能拥有一部宪法。一部宪法仅属于一个国家。但是宪法没有约束力。一个国家可能拥有也可能没有,例如以色列和英国。

可以将同一连接视为强制连接和可选连接:
一个人只能拥有一本护照。一本护照只有一个所有者。
A)护照的存在是可选的-公民可能没有护照。这是一个可选链接。
B)一本护照只能有一个所有者。在这种情况下,这已经是强制连接。

7.3。多对多


任何多对多关系都是可选的。例如:
一个人可以投资不同公司的股票(很多)。一些公司的投资者是某些人(很多)。
A)一个人可能根本不将自己的钱投资于股票。
B)没有人可以购买公司的股票。

8.如何阅读图表?


上面,我给出了我们创建的表的图表。但是,为了理解它们,您需要知道如何“阅读”它们。我们将使用第5.3段中的图表示例来理解这一点。



我们看到一对多的关系。一个人拥有许多电话。

  1. 在桌子旁边,人是一把金钥匙。它表示单词“一个”。
  2. “电话”表附近是一个无穷大符号。它表示“许多”。

9.总结


  1. 连接是:
    • 多对多。
    • 一对多。
      1)进行强制性沟通;
      2)带有可选链接。
    • 一对一。
      1)进行强制性沟通;
      2)带有可选链接。
  2. 使用外键组织连接。
  3. 外键是引用另一个表的主键或唯一键的属性或属性集。换句话说,它类似于指向另一个表中某行的指针。

10.目标


为了更好地吸收材料,建议您解决以下问题:

  1. : id, , , , . , , , .
  2. : id, , , . , .
  3. : , , ,
    • : id, , .
    • : id, .

    , — . , .
  4. 6.2. - , DisabledEmployee.

All Articles