Mysql
 sql >> Datenbank >  >> RDS >> Mysql

„Viele zu zwei“-Beziehung

Diese Frage zeigt, dass Sie Entitätsbeziehungen nicht vollständig verstehen (keine Unhöflichkeit beabsichtigt). Davon gibt es unten vier (technisch gesehen nur 3) Typen:

One to One
One to Many
Many to One
Many to Many

Eins zu Eins (1:1): In diesem Fall wurde eine Tabelle in zwei Teile zerlegt, um der Normalisierung oder häufiger dem Open-Closed-Prinzip zu entsprechen.

Normalisierung Compliance:Möglicherweise haben Sie eine Geschäftsregel, dass jeder Kunde nur ein Konto hat. Technisch gesehen könnten Sie in diesem Fall sagen, dass sich Kunde und Konto alle in derselben Tabelle befinden könnten, aber dies verstößt gegen die Regeln der Normalisierung, also teilen Sie sie auf und machen ein 1:1.

Öffnen-Schließen-Prinzip Compliance:Eine Kundentabelle kann ID, Vor- und Nachnamen und Adresse enthalten. Später beschließt jemand, ein Geburtsdatum hinzuzufügen und damit die Möglichkeit, das Alter zusammen mit einer Reihe anderer dringend benötigter Felder zu berechnen. Dies ist ein zu stark vereinfachtes Eins-zu-eins-Beispiel, aber Sie erhalten den Hauptzweck dafür, Ihre Datenbank zu erweitern, ohne vorhandenen Code zu beschädigen. Viel geschriebener Code ist (leider) eng an die Datenbank gekoppelt, sodass Änderungen in der Struktur einer Tabelle den Code beschädigen. Das Hinzufügen einer solchen 1:1-Tabelle erweitert die Tabelle, um neue Anforderungen zu erfüllen, ohne das Original zu ändern, wodurch alter Code weiterhin normal funktioniert und neuer Code die neuen DB-Funktionen nutzen kann.

Der Nachteil der Normalisierung und Erweiterung von Tabellen mit 1:1-Beziehungen auf diese Weise ist die Leistung. Auf stark ausgelasteten Systemen besteht das erste Ziel zur Steigerung der Datenbankleistung häufig darin, solche Tabellen zu denormalisieren und zu einer einzigen Tabelle zusammenzufassen und die Indizes zu optimieren, wodurch die Notwendigkeit entfällt, Verknüpfungen zu verwenden und aus mehreren Tabellen zu lesen. Normalisierung / De-Normalisierung ist weder gut noch schlecht, da es von den Bedürfnissen des Systems abhängt. Die meisten Systeme beginnen normalerweise mit normalisierten Änderungen, wenn sie benötigt werden, aber diese Änderung muss wie erwähnt sehr sorgfältig durchgeführt werden, wenn der Code eng an die DB-Struktur gekoppelt ist, wird dies mit ziemlicher Sicherheit dazu führen, dass das System fehlschlägt. Das heißt, wenn Sie 2 Tabellen kombinieren, hört eine auf zu existieren, der gesamte Code, der diese jetzt nicht vorhandene Tabelle enthält, schlägt fehl, bis sie geändert wird (stellen Sie sich in db-Begriffen vor, Beziehungen zu einer der Tabellen in 1:1 zu verbinden, wenn Sie diese Tabellen entfernen , dies bricht die Beziehungen und so muss die Struktur stark modifiziert werden, um dies zu kompensieren.Leider sind solche schlechten Designs in der DB-Welt in den meisten Fällen viel leichter zu erkennen als in der Softwarewelt, und Sie bemerken normalerweise nicht, dass etwas schief gelaufen ist im Code, bis alles auseinanderfällt), es sei denn, das System ist ordnungsgemäß mit Trennung von Bedenken im Hinterkopf.

Es kommt der Vererbung in der objektorientierten Programmierung am nächsten. Aber es ist nicht ganz dasselbe.

Eins zu Viele (1:M) / Viele zu Eins (M:1): Diese beiden Beziehungen (weshalb aus 4 3 werden) sind die beliebtesten Beziehungstypen. Sie sind beide die gleiche Art von Beziehung, das einzige, was sich ändert, ist Ihre Sichtweise. Ein Beispiel Ein Kunde hat viele Telefonnummern, oder alternativ können viele Telefonnummern zu einem Kunden gehören.

In der objektorientierten Programmierung würde dies als Komposition betrachtet werden. Es ist keine Vererbung, aber Sie sagen, dass ein Gegenstand aus vielen Teilen besteht. Dies wird normalerweise mit Arrays / Listen / Sammlungen usw. innerhalb von Klassen dargestellt, im Gegensatz zu einer Vererbungsstruktur.

Viele zu Vielen (M:M): Diese Art von Beziehung mit der aktuellen Technologie ist unmöglich. Aus diesem Grund müssen wir es in zwei Eins-zu-viele-Beziehungen mit einer "Assoziations"-Tabelle aufteilen, die sie verbindet. Die Viele-Seite der beiden Eins-zu-Viele-Beziehungen befindet sich immer in der Assoziations-/Link-Tabelle.

Für Ihr Beispiel hat die Person, die gesagt hat, dass Sie viele zu viele brauchen, Recht. Weil eine Zwei-zu-Viele-Beziehung effektiv eine Viele-zu-Viele-Beziehung (dh mehr als eins) ist. Nur so können Sie Ihr System zum Laufen bringen. Es sei denn, Sie beabsichtigen, auf dem Gebiet der Relationalrechnung zu forschen eine neue Art von Beziehung zu finden, die dies ermöglichen würde.

Auch für solche Beziehungen (m2m) haben Sie zwei Möglichkeiten:Erstellen Sie entweder einen zusammengesetzten Schlüssel in der Linker-Tabelle, damit die Kombination der Felder zu einem eindeutigen Eintrag wird (wenn Sie an der DB-Optimierung interessiert sind, ist dies die langsamere Wahl, nimmt aber weniger Platz ein). Alternativ erstellen Sie ein drittes Feld mit einer automatisch generierten ID-Spalte und machen dies zum Primärschlüssel (für die DB-Optimierung ist dies die schnellere Wahl, nimmt aber mehr Platz ein).

In Ihrem Beispiel speziell oben ...

Dies wäre eine Viele-zu-Viele-Beziehung mit der Telefonnummerntabelle als Verbindungstabelle zwischen Unternehmen und Benutzern. Um sicherzustellen, dass sich keine Telefonnummer wiederholt, legen Sie sie wie erläutert einfach als Primärschlüssel fest oder verwenden einen anderen Primärschlüssel und setzen das Telefonnummernfeld auf eindeutig.

Bei solchen Fragen kommt es wirklich darauf an, wie man sie formuliert. Was dazu führt, dass Sie darüber verwirrt sind, und wie Sie diese Verwirrung überwinden, um die Lösung zu finden, ist einfach. Formulieren Sie das Problem wie folgt um. Beginnen Sie mit der Frage, ob es eins zu eins ist, wenn die Antwort nein ist, fahren Sie fort. Als nächstes fragen Sie, ob es eins zu vielen ist, wenn die Antwort "Nein, weitermachen" lautet. Die einzige andere verbleibende Option ist viele zu viele. Seien Sie jedoch vorsichtig und stellen Sie sicher, dass Sie die ersten beiden Fragen sorgfältig geprüft haben, bevor Sie fortfahren. Viele unerfahrene Datenbankexperten verkomplizieren Probleme oft, indem sie eins zu vielen als viele zu vielen definieren. Noch einmal, die bei weitem beliebteste Art von Beziehung ist eine zu vielen (ich würde sagen 90%), wobei die vielen zu vielen und eine zu eins die restlichen 10% jeweils zu 7/3 aufteilen. Aber diese Zahlen sind nur meine persönliche Sichtweise, also zitieren Sie sie nicht als branchenübliche Statistiken. Mein Punkt ist, besonders darauf zu achten, dass es definitiv nicht eins zu vielen ist, bevor ich viele zu viele auswähle. Der Mehraufwand lohnt sich.

Um nun die Linker-Tabelle zwischen den beiden zu finden, entscheiden Sie, welche beiden Ihre Haupttabellen sind und welche Felder zwischen ihnen geteilt werden müssen. In diesem Fall müssen sich Firmen- und Benutzertabellen das Telefon teilen. Daher müssen Sie eine neue Telefontabelle als Linker erstellen.

Der Warnalarm für Missverständnisse sollte angezeigt werden, sobald Sie entscheiden, dass keiner der 3 für Sie funktioniert. Dies sollte ausreichen, um Ihnen zu sagen, dass Sie die Beziehungsfrage einfach nicht richtig formulieren. Du wirst darin mit der Zeit besser werden, aber es ist eine essentielle Fähigkeit und sollte wirklich so schnell wie möglich für deine eigene Gesundheit gemeistert werden.

Natürlich könnten Sie auch zu einer objektorientierten Datenbank gehen, die eine Reihe anderer Beziehungen ermöglicht, die als "hierarchische" Beziehungen bezeichnet werden. Das ist großartig, wenn Sie daran denken, auch Programmierer zu werden. Aber ich würde das nicht empfehlen, da es dir den Kopf verdrehen wird, wenn du anfängst, Wege zu finden, die verschiedenen Arten von Beziehungen zu kombinieren. Vor allem, da es nicht viel Bedarf gibt, da fast alle Datenbanken auf der Welt nur aus diesen 3 Arten von Beziehungen bestehen, es sei denn, sie sind etwas ganz Besonderes.

Hoffe das war eine vernünftige Antwort. Vielen Dank, dass Sie sich die Zeit genommen haben, es zu lesen.