Beziehungen zwischen Datenbanktabellen

1. Einleitung


Kommunikation ist ein ziemlich wichtiges Thema, das beim Entwerfen von Datenbanken verstanden werden sollte. Aus meiner persönlichen Erfahrung möchte ich sagen, dass ich nach dem Erkennen der Zusammenhänge die Normalisierung der Datenbank viel leichter verstehen konnte .

1.1. Für wen ist dieser Artikel?


Dieser Artikel ist nützlich für diejenigen, die die Beziehungen zwischen Datenbanktabellen verstehen möchten. Darin habe ich versucht, im Klartext zu sagen, was es ist. Zum besseren Verständnis des Themas wechsele ich theoretisches Material mit praktischen Beispielen ab, die in Form eines Diagramms und einer Abfrage dargestellt werden, mit der die von uns benötigten Tabellen erstellt werden. Ich verwende Microsoft SQL Server DBMS und schreibe Abfragen in T-SQL. Der von mir geschriebene Code sollte auf anderen DBMS funktionieren, da Abfragen universell sind und keine spezifischen T-SQL-Konstrukte verwenden.

1.2. Wie können Sie dieses Wissen anwenden?


  1. Das Erstellen von Datenbanken wird für Sie einfacher und verständlicher.
  2. Das Verständnis der Beziehungen zwischen Tabellen hilft Ihnen dabei, die Normalisierung besser zu verstehen, was beim Entwerfen einer Datenbank sehr wichtig ist.
  3. Der Umgang mit einer fremden Datenbank wird viel einfacher.
  4. Beim Interview wird dies ein sehr gutes Plus sein.

2. Danksagung


Der Rat und die Kritik der Autoren wurden berücksichtigt. jobgemws, ungefüllt, Firnind, Hamaruba.
Danke!

3.1. Wie ist die Kommunikation organisiert?


Links werden mit Fremdschlüsseln erstellt.
Ein Fremdschlüssel ist ein Attribut oder eine Reihe von Attributen, die auf den Primärschlüssel oder die Eindeutigkeit einer anderen Tabelle verweisen. Mit anderen Worten, es ist so etwas wie ein Zeiger auf eine Zeile in einer anderen Tabelle.

3.2. Arten von Beziehungen


Links sind unterteilt in:

  1. Viel zu viel.
  2. Eins zu viele.
    • mit obligatorischer Verbindung;
    • mit optionaler Kommunikation;
  3. Eins zu eins.
    • mit obligatorischer Verbindung;
    • mit optionaler Kommunikation;

Lassen Sie uns jeden von ihnen im Detail betrachten.

4. Viele zu viele


Stellen Sie sich vor, wir müssen eine Datenbank schreiben, die von einem Mitarbeiter eines IT-Unternehmens gespeichert wird. Gleichzeitig gibt es einen bestimmten Standardsatz von Beiträgen. Dabei:

  • Ein Mitarbeiter kann eine oder mehrere Stellen haben. Ein bestimmter Mitarbeiter kann beispielsweise sowohl Administrator als auch Programmierer sein.
  • Eine Position kann einen oder mehrere Mitarbeiter „besitzen“. Zum Beispiel sind Administratoren eine bestimmte Gruppe von Arbeitern. Mit anderen Worten, einige Arbeiter gehören Admins.

Mitarbeiter werden durch die Mitarbeitertabelle (ID, Name, Alter) dargestellt, Positionen werden durch die Positionstabelle (ID und Positionsname) dargestellt. Wie Sie sehen, sind beide Tabellen gemäß der Viele-zu-Viele-Regel verbunden: Jeder Mitarbeiter hat eine oder mehrere Positionen (viele Positionen), jede Position hat einen oder mehrere Mitarbeiter (viele Mitarbeiter).

4.1. Wie erstelle ich solche Tabellen?


Wir haben bereits zwei Tabellen, die den Mitarbeiter und den Beruf beschreiben. Jetzt müssen wir viele zu viele Beziehungen zwischen ihnen herstellen. Um eine solche Beziehung zu implementieren, benötigen wir eine Art Vermittler zwischen den Tabellen "Mitarbeiter" und "Position". In unserem Fall handelt es sich um eine bestimmte Tabelle „EmployeesPositions“ (Arbeiter und Positionen). Diese Mediationstabelle verknüpft den Mitarbeiter und die Position wie folgt:
Mitarbeiter-IDPositionId
11
12
23
33
Links sind die Mitarbeiter (ihre ID), rechts die Positionen (ihre ID). Mitarbeiter und Positionen in dieser Tabelle werden mit id'shniki angegeben.

Diese Tabelle kann von zwei Seiten betrachtet werden:

  1. Wir sagen also, dass sich der Mitarbeiter mit der ID 1 auf der Position mit der ID 1 befindet. Achten Sie gleichzeitig darauf, dass der Mitarbeiter mit der ID 1 in dieser Tabelle zwei Positionen hat: 1 und 2. Das heißt, jeder Mitarbeiter auf der linken Seite entspricht eine bestimmte Position auf der rechten Seite.
  2. Wir können auch sagen, dass Beiträge mit ID 3 Benutzern mit ID 2 und 3 gehören. Das heißt, jeder Mitarbeiter auf der rechten Seite hat einen bestimmten Mitarbeiter auf der linken Seite.

4.2. Implementierung


Diagramm


T-SQL-Code
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)


Erläuterung
foreign key primary key unique .

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


4.3. Fazit


Um viele-zu-viele-Beziehungen zu implementieren, benötigen wir einen Mediator zwischen den beiden betrachteten Tabellen. Es müssen zwei Fremdschlüssel gespeichert werden, von denen sich der erste auf die erste Tabelle und der zweite auf die zweite bezieht.

5. Eins zu viele


Dies ist die häufigste Verbindung zwischen Datenbanken. Wir betrachten es, nachdem wir viele mit vielen zum Vergleich verknüpft haben.

Angenommen, wir müssen eine bestimmte Datenbank implementieren, die Benutzerdaten aufzeichnet. Der Benutzer hat: Name, Nachname, Alter, Telefonnummern. Darüber hinaus kann jeder Benutzer eine oder mehrere Telefonnummern (viele Telefonnummern) haben.

In diesem Fall stellen wir Folgendes fest: Ein Benutzer kann viele Telefonnummern haben, es kann jedoch nicht gesagt werden, dass ein bestimmter Benutzer zur Telefonnummer gehört.

Mit anderen Worten, das Telefon gehört nur einem Benutzer. Ein Benutzer kann 1 oder mehrere Telefone (viele) besitzen.

Wie wir sehen können, ist diese Beziehung eins zu viele.

5.1. Wie erstelle ich solche Tabellen?


Benutzer werden durch eine bestimmte "Person" -Tabelle (ID, Vorname, Nachname, Alter) dargestellt, Telefonnummern werden durch die "Telefon" -Tabelle dargestellt. Es wird so aussehen:
PhoneIdPersonidTelefonnummer
1511 091-10
2519 124-66
31721 972-02
Diese Tabelle enthält drei Telefonnummern. In diesem Fall gehören die Telefonnummern mit ID 1 und 2 dem Benutzer mit ID 5. Die Nummer mit ID 3 gehört jedoch dem Benutzer mit ID 17.
Hinweis . Wenn die Tabelle "Telefone" mehr Attribute hätte, würden wir sie sicher zu dieser Tabelle hinzufügen.

5.2. Warum machen wir hier keinen Zwischentisch?


Eine Zwischentabelle wird nur benötigt, wenn wir eine Viele-zu-Viele-Beziehung haben. Aus dem einfachen Grund, dass wir es von zwei Seiten betrachten können. Wie die EmployeesPositions-Tabelle zuvor:

  1. Jeder Mitarbeiter hat mehrere Positionen (viele).
  2. Jede Position gehört mehreren Mitarbeitern (viele).

In unserem Fall können wir jedoch nicht sagen, dass jedes Telefon mehrere Benutzer hat - nur ein Benutzer kann zu einer Telefonnummer gehören.
Lesen Sie nun noch einmal den Hinweis am Ende von Absatz 5.1. - es wird für Sie verständlicher.

5.3. Implementierung


Diagramm


T-SQL-Code
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')


Erläuterung
Phone . ( Person). , : « ». , id .

6. Eins zu eins


Stellen Sie sich vor, Sie hätten bei der Arbeit die Aufgabe, eine Datenbank zu schreiben, in der alle Mitarbeiter für die Personalabteilung erfasst werden. Der Chef versicherte, dass das Unternehmen nur den Namen, das Alter und die Telefonnummer des Mitarbeiters kennen müsse. Sie haben eine solche Datenbank entwickelt und alle 1000 Mitarbeiter des Unternehmens darin platziert. Und dann sagt der Chef, dass er aus irgendeinem Grund wissen muss, ob der Mitarbeiter behindert ist oder nicht. Am einfachsten fällt Ihnen ein, Ihrer Tabelle eine neue Bool-Spalte hinzuzufügen. Die Eingabe von 1000 Werten ist jedoch zu lang, und true wird viel seltener als false eingegeben (2% sind beispielsweise true).

Eine einfachere Lösung wäre das Erstellen einer neuen Tabelle. Nennen wir sie "DisabledEmployee". Es wird so aussehen:
DisabledPersonIdMitarbeiter-ID
1159
2722
3937
Dies ist jedoch keine Eins-zu-Eins-Beziehung. Tatsache ist, dass in einer solchen Tabelle ein Mitarbeiter mehr als einmal eingegeben werden kann. Dementsprechend haben wir eine Eins-zu-Viele-Beziehung erhalten: Ein Mitarbeiter kann mehrmals deaktiviert werden. Es muss sichergestellt werden, dass der Mitarbeiter nur einmal in die Tabelle eingetragen werden kann bzw. nur einmal deaktiviert werden kann. Dazu müssen wir angeben, dass in der Spalte EmployeeId nur eindeutige Werte gespeichert werden können. Wir müssen der EmloyeeId-Spalte nur eine eindeutige Einschränkung auferlegen. Diese Einschränkung gibt an, dass ein Attribut nur eindeutige Werte annehmen kann .

Auf diese Weise haben wir eine Eins-zu-Eins-Beziehung.

Die Notiz. Beachten Sie, dass wir dem EmloyeeId-Attribut auch eine Primärschlüsseleinschränkung auferlegen können. Es unterscheidet sich von der eindeutigen Einschränkung nur dadurch, dass es nicht null sein kann.

6.1. Fazit


Wir können sagen, dass eine Eins-zu-Eins-Beziehung eine Aufteilung derselben Tabelle in zwei ist.

6.2. Implementierung


Diagramm


T-SQL-Code
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)


Erläuterung
DisabledEmployee EmployeeId, . EmployeeId Employee. , unique, , . , .

7. Obligatorische und optionale Kommunikation


Beziehungen können in obligatorische und optionale Beziehungen unterteilt werden.

7.1. Eins zu viele


  1. Eins zu viele mit einer obligatorischen Verbindung:
    Viele Soldaten gehören einem Regiment an. Ein Kämpfer gehört nur einem Regiment an. Bitte beachten Sie, dass jeder Soldat notwendigerweise einem Regiment angehört und ein Regiment ohne Soldaten nicht existieren kann.
  2. Eins zu viele mit optionaler Verbindung:
    Alle Menschen leben auf dem Planeten Erde. Jeder lebt nur auf der Erde. Darüber hinaus kann ein Planet ohne Menschlichkeit existieren. Dementsprechend ist es optional, uns auf der Erde zu finden

Die gleiche Beziehung kann als obligatorisch und als optional angesehen werden. Betrachten Sie dieses Beispiel:
Eine leibliche Mutter kann viele Kinder haben. Ein Kind hat nur eine leibliche Mutter.
A) Eine Frau hat nicht unbedingt ihre eigenen Kinder. Dementsprechend ist die Kommunikation optional.
B) Das Kind hat notwendigerweise nur eine leibliche Mutter - in diesem Fall ist eine Kommunikation erforderlich.

7.2. Eins zu eins


  1. Eins zu eins mit einer obligatorischen Verbindung:
    Ein Bürger eines bestimmten Landes darf nur einen Pass dieses Landes haben. Ein Reisepass hat nur einen Inhaber.
  2. Eins zu eins mit optionalem Link:
    Ein Land kann nur eine Verfassung haben. Eine Verfassung gehört nur einem Land. Die Verfassung ist jedoch nicht bindend. Ein Land kann es haben oder nicht, wie zum Beispiel Israel und Großbritannien.

Dieselbe Verbindung kann als obligatorisch und als optional angesehen werden:
Eine Person kann nur einen Reisepass haben. Ein Reisepass hat nur einen Besitzer.
A) Das Vorhandensein eines Reisepasses ist freiwillig - ein Bürger hat ihn möglicherweise nicht. Dies ist ein optionaler Link.
B) Ein Reisepass darf nur einen Besitzer haben. In diesem Fall ist dies bereits eine obligatorische Verbindung.

7.3. Viel zu viel


Jede Viele-zu-Viele-Beziehung ist optional. Zum Beispiel:
Eine Person kann in Aktien verschiedener Unternehmen (viele) investieren. Die Investoren einiger Unternehmen sind bestimmte Personen (viele).
A) Eine Person darf ihr Geld überhaupt nicht in Aktien investieren.
B) Niemand konnte Aktien der Gesellschaft kaufen.

8. Wie lese ich Diagramme?


Oben habe ich Diagramme der von uns erstellten Tabellen gegeben. Aber um sie zu verstehen, müssen Sie wissen, wie man sie "liest". Wir werden dies am Beispiel des Diagramms aus Absatz 5.3 verstehen.



Wir sehen eine Eins-zu-Viele-Beziehung. Eine Person besitzt viele Telefone.

  1. In der Nähe des Tisches ist Person ein goldener Schlüssel. Es bezeichnet das Wort "eins".
  2. In der Nähe des Telefontisches befindet sich ein Unendlichkeitszeichen. Es bezeichnet das Wort "viele".

9. Zusammenfassung


  1. Verbindungen sind:
    • Viel zu viel.
    • Eins zu viele.
      1) mit obligatorischer Mitteilung;
      2) mit einem optionalen Link.
    • Eins zu eins.
      1) mit obligatorischer Mitteilung;
      2) mit einem optionalen Link.
  2. Verbindungen werden mit Fremdschlüsseln organisiert.
  3. Ein Fremdschlüssel ist ein Attribut oder eine Reihe von Attributen, die auf den Primärschlüssel oder die Eindeutigkeit einer anderen Tabelle verweisen. Mit anderen Worten, es ist so etwas wie ein Zeiger auf eine Zeile in einer anderen Tabelle.

10. Ziele


Zur besseren Assimilation des Materials empfehle ich Ihnen, die folgenden Probleme zu lösen:

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

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

All Articles