Ich habe neulich über Normalisierung nachgedacht, und mir ist eingefallen, dass ich mir keine Zeit vorstellen kann, in der es eine 1: 1-Beziehung in einer Datenbank geben sollte.
Name: SSN? Ich hätte sie in derselben Tabelle PersonID: AddressID? Wieder der gleiche Tisch.
Ich kann mir zig Beispiele für 1: viele oder viele: viele (mit entsprechenden Zwischentabellen) einfallen lassen, aber niemals ein 1: 1.
Vermisse ich etwas Offensichtliches?
sql
database-design
one-to-one
database-normalization
Pulsehead
quelle
quelle
Antworten:
Eine 1: 1-Beziehung zeigt normalerweise an, dass Sie aus irgendeinem Grund eine größere Entität partitioniert haben. Oft liegt dies an Leistungsgründen im physischen Schema, aber es kann auch auf der logischen Seite auftreten, wenn erwartet wird, dass ein großer Teil der Daten gleichzeitig "unbekannt" ist (in diesem Fall haben Sie ein 1: 0) oder 1: 1, aber nicht mehr).
Als Beispiel für eine logische Partition: Sie haben Daten über einen Mitarbeiter, aber es gibt einen größeren Datensatz, der genau dann erfasst werden muss, wenn er sich für eine Krankenversicherung entscheidet. Ich würde die demografischen Daten zur Krankenversicherung in einer anderen Tabelle aufbewahren, um sowohl die Sicherheitspartitionierung zu vereinfachen als auch zu vermeiden, dass diese Daten in Fragen ohne Bezug zur Versicherung herumgeschleppt werden.
Ein Beispiel für eine physische Partition wären dieselben Daten, die auf mehreren Servern gehostet werden. Ich kann die demografischen Daten zur Krankenversicherung in einem anderen Bundesstaat aufbewahren (z. B. in der Personalabteilung), und die Primärdatenbank kann möglicherweise nur über einen Verbindungsserver mit ihr verbunden werden. Dabei wird vermieden, dass vertrauliche Daten an andere Standorte repliziert werden, ohne dass sie verfügbar sind (hier selten angenommen) Abfragen, die es brauchen.
Die physische Partitionierung kann nützlich sein, wenn Sie Abfragen haben, die konsistente Teilmengen einer größeren Entität benötigen.
quelle
Ein Grund ist die Datenbankeffizienz. Mit einer 1: 1-Beziehung können Sie die Felder aufteilen, die während einer Zeilen- / Tabellensperre betroffen sind. Wenn Tabelle A eine Menge Aktualisierungen enthält und Tabelle B eine Menge Lesevorgänge enthält (oder eine Menge Aktualisierungen von einer anderen Anwendung enthält), hat die Sperrung von Tabelle A keinen Einfluss darauf, was in Tabelle B vor sich geht.
Andere sprechen einen guten Punkt an. Sicherheit kann auch ein guter Grund sein, je nachdem, wie Anwendungen usw. auf das System treffen. Ich würde eher einen anderen Ansatz wählen, aber es kann eine einfache Möglichkeit sein, den Zugriff auf bestimmte Daten einzuschränken. Es ist wirklich einfach, zur Not den Zugriff auf einen bestimmten Tisch zu verweigern.
Mein Blogeintrag darüber.
quelle
Kargheit. Die Datenbeziehung kann technisch 1: 1 sein, aber entsprechende Zeilen müssen nicht für jede Zeile vorhanden sein. Wenn Sie also 20 Millionen Zeilen haben und einige Werte nur für 0,5% vorhanden sind, ist die Platzersparnis enorm, wenn Sie diese Spalten in eine Tabelle verschieben, die nur spärlich gefüllt werden kann.
quelle
Die meisten hochrangigen Antworten geben sehr nützliche Gründe für die Optimierung und Optimierung der Datenbank für 1: 1-Beziehungen an, aber ich möchte mich nur auf "in the wild" -Beispiele konzentrieren, bei denen 1: 1-Beziehungen natürlich vorkommen.
Bitte beachten Sie ein wichtiges Merkmal der Datenbankimplementierung der meisten dieser Beispiele: Es werden keine historischen Informationen über die 1: 1-Beziehung gespeichert. Das heißt, diese Beziehungen sind zu jedem Zeitpunkt 1: 1. Wenn der Datenbankdesigner Änderungen in den Beziehungsteilnehmern im Laufe der Zeit aufzeichnen möchte, werden die Beziehungen zu 1: M oder M: M; Sie verlieren ihre 1: 1-Natur. Wenn das verstanden ist, geht es weiter:
"Is-A" oder Supertyp / Subtyp oder Vererbungs- / Klassifizierungsbeziehungen: Diese Kategorie ist, wenn eine Entität ein bestimmter Typ einer anderen Entität ist. Beispielsweise könnte es eine Mitarbeiterentität mit Attributen geben, die für alle Mitarbeiter gelten, und dann verschiedene Entitäten, um bestimmte Mitarbeitertypen mit Attributen anzugeben, die für diesen Mitarbeitertyp eindeutig sind, z. B. Arzt, Buchhalter, Pilot usw. Bei diesem Entwurf werden seitdem mehrere Nullen vermieden Viele Mitarbeiter hätten nicht die speziellen Attribute eines bestimmten Subtyps. Andere Beispiele in dieser Kategorie könnten Produkt als Supertyp und ManufacturingProduct and MaintenanceSupply als Subtypen sein. Tier als Supertyp und Hund und Katze als Subtypen; usw. Beachten Sie, dass immer dann, wenn Sie versuchen, eine objektorientierte Vererbungshierarchie einer relationalen Datenbank zuzuordnen (z. B. in einem objektrelationalen Modell), diese Art von Beziehung solche Szenarien darstellt.
"Chef" -Beziehungen wie Manager, Vorsitzender, Präsident usw., in denen eine Organisationseinheit nur einen Chef haben kann und eine Person nur Chef einer Organisationseinheit sein kann. Wenn diese Regeln gelten, haben Sie eine 1: 1-Beziehung, z. B. einen Abteilungsleiter, einen CEO eines Unternehmens usw. "Chef" -Beziehungen gelten nicht nur für Personen. Die gleiche Art von Beziehung entsteht, wenn es beispielsweise nur ein Geschäft als Hauptsitz eines Unternehmens gibt oder wenn nur eine Stadt die Hauptstadt eines Landes ist.
Einige Arten der knappen Ressourcenzuweisung , z. B. einem Mitarbeiter, kann jeweils nur ein Firmenwagen zugewiesen werden (z. B. ein LKW pro LKW, ein Taxi pro Taxifahrer usw.). Ein Kollege hat mir kürzlich dieses Beispiel gegeben.
Ehe (zumindest in Rechtsordnungen, in denen Polygamie illegal ist): Eine Person kann jeweils nur mit einer anderen Person verheiratet sein. Ich habe dieses Beispiel aus einem Lehrbuch erhalten, das dies als Beispiel für eine unäre 1: 1-Beziehung verwendete, wenn ein Unternehmen Ehen zwischen seinen Mitarbeitern aufzeichnet.
Übereinstimmende Reservierungen : Wenn eine eindeutige Reservierung vorgenommen und dann als zwei separate Einheiten erfüllt wird. Beispielsweise kann ein Autovermietungssystem eine Reservierung in einer Entität und dann eine tatsächliche Vermietung in einer separaten Entität aufzeichnen. Obwohl eine solche Situation alternativ als eine Einheit konzipiert werden könnte, kann es sinnvoll sein, die Einheiten zu trennen, da nicht alle Reservierungen erfüllt sind und nicht alle Anmietungen Reservierungen erfordern und beide Situationen sehr häufig sind.
Ich wiederhole den Vorbehalt, dass die meisten dieser Beziehungen nur dann 1: 1 sind, wenn keine historischen Informationen aufgezeichnet wurden. Wenn also ein Mitarbeiter seine Rolle in einer Organisation ändert oder ein Manager die Verantwortung für eine andere Abteilung übernimmt oder einem Mitarbeiter ein Fahrzeug zugewiesen wird oder jemand verwitwet ist und wieder heiratet, können sich die Beziehungsteilnehmer ändern. Wenn in der Datenbank keine Vorgeschichte zu diesen 1: 1-Beziehungen gespeichert ist, bleiben sie legitime 1: 1-Beziehungen. Wenn die Datenbank jedoch historische Informationen aufzeichnet (z. B. das Hinzufügen von Start- und Enddaten für jede Beziehung), werden sie fast alle zu M: M-Beziehungen.
Es gibt zwei bemerkenswerte Ausnahmen von der historischen Anmerkung: Erstens ändern sich einige Beziehungen so selten, dass historische Informationen normalerweise nicht gespeichert werden. Beispielsweise sind die meisten IS-A-Beziehungen (z. B. Produkttyp) unveränderlich. das heißt, sie können sich nie ändern. Somit ist der historische Aufzeichnungspunkt umstritten; Diese würden immer als natürliche 1: 1-Beziehungen implementiert. Zweitens werden die Daten der Reservierungs-Miet-Beziehung separat gespeichert, da die Reservierung und die Vermietung unabhängige Ereignisse sind, die jeweils ihre eigenen Daten haben. Da die Entitäten ihre eigenen Daten haben und nicht die 1: 1-Beziehung selbst ein Startdatum hat, bleiben diese als 1: 1-Beziehungen, obwohl historische Informationen gespeichert sind.
quelle
Ihre Frage kann aufgrund der Art und Weise, wie Sie sie formuliert haben, auf verschiedene Arten interpretiert werden. Die Antworten zeigen dies.
In der realen Welt kann es definitiv 1: 1-Beziehungen zwischen Datenelementen geben. Keine Frage. Die "ist eine" Beziehung ist im Allgemeinen eins zu eins. Ein Auto ist ein Fahrzeug. Ein Auto ist ein Fahrzeug. Ein Fahrzeug kann ein Auto sein. Einige Fahrzeuge sind Lastwagen. In diesem Fall ist ein Fahrzeug kein Auto. Mehrere Antworten befassen sich mit dieser Interpretation.
Aber ich denke, was Sie wirklich fragen, ist ... wenn 1: 1-Beziehungen bestehen, sollten Tabellen jemals aufgeteilt werden? Mit anderen Worten, sollten Sie jemals zwei Tabellen haben, die genau dieselben Schlüssel enthalten? In der Praxis analysieren die meisten von uns nur Primärschlüssel und keine anderen Kandidatenschlüssel, aber diese Frage ist etwas anders.
Normalisierungsregeln für 1NF, 2NF und 3NF erfordern niemals das Zerlegen (Aufteilen) einer Tabelle in zwei Tabellen mit demselben Primärschlüssel. Ich habe nicht herausgefunden, ob das Einfügen eines Schemas in BCNF, 4NF oder 5NF jemals zu zwei Tabellen mit denselben Schlüsseln führen kann. Ich werde vermuten, dass die Antwort nein ist.
Es gibt einen Normalisierungsgrad namens 6NF. Die Normalisierungsregel für 6NF kann definitiv zu zwei Tabellen mit demselben Primärschlüssel führen. 6NF hat gegenüber 5NF den Vorteil, dass NULLS vollständig vermieden werden können. Dies ist für einige, aber nicht alle Datenbankdesigner wichtig. Ich habe mir nie die Mühe gemacht, ein Schema in 6NF einzufügen.
In 6NF können fehlende Daten durch eine ausgelassene Zeile anstelle einer Zeile mit einem NULL in einer Spalte dargestellt werden.
Es gibt andere Gründe als die Normalisierung für das Aufteilen von Tabellen. Manchmal führen geteilte Tabellen zu einer besseren Leistung. Bei einigen Datenbankmodulen können Sie dieselben Leistungsvorteile erzielen, indem Sie die Tabelle partitionieren, anstatt sie tatsächlich zu teilen. Dies kann den Vorteil haben, dass das logische Design leicht verständlich bleibt und die Datenbank-Engine die Tools erhält, die zur Beschleunigung erforderlich sind.
quelle
Ich benutze sie hauptsächlich aus einigen Gründen. Einer ist der signifikante Unterschied in der Datenänderungsrate. Einige meiner Tabellen verfügen möglicherweise über Prüfpfade, in denen ich frühere Versionen von Datensätzen nachverfolge. Wenn ich nur frühere Versionen von 5 von 10 Spalten nachverfolgen möchte, ist es effizienter, diese 5 Spalten auf eine separate Tabelle mit einem Prüfpfadmechanismus aufzuteilen. Außerdem habe ich möglicherweise Datensätze (z. B. für eine Buchhaltungs-App), die nur geschrieben werden. Sie können die Dollarbeträge oder das Konto, für das sie bestimmt waren, nicht ändern. Wenn Sie einen Fehler gemacht haben, müssen Sie einen entsprechenden Datensatz erstellen, um den falschen Datensatz anzupassen, und dann einen Korrektureintrag erstellen. Ich habe Einschränkungen für die Tabelle, die die Tatsache erzwingen, dass sie nicht aktualisiert oder gelöscht werden können, aber ich habe möglicherweise einige Attribute für dieses Objekt, die formbar sind. Diese werden ohne Einschränkung der Änderung in einer separaten Tabelle gespeichert. Ein anderes Mal mache ich das in Krankenaktenanwendungen. Es gibt Daten zu einem Besuch, die nach dem Abmelden nicht mehr geändert werden können, und andere Daten zu einem Besuch, die nach dem Abmelden geändert werden können. In diesem Fall werde ich die Daten aufteilen und einen Auslöser für die gesperrte Tabelle setzen, der Aktualisierungen der gesperrten Tabelle beim Abmelden ablehnt, aber Aktualisierungen der Daten zulässt, bei denen sich der Arzt nicht abmeldet.
Ein anderes Poster kommentierte, dass 1: 1 nicht normalisiert ist. Ich würde dem in einigen Situationen, insbesondere bei der Subtypisierung, nicht zustimmen. Angenommen, ich habe eine Mitarbeitertabelle und der Primärschlüssel ist ihre SSN (dies ist ein Beispiel. Speichern wir die Debatte darüber, ob dies ein guter Schlüssel für einen anderen Thread ist oder nicht). Die Mitarbeiter können unterschiedlicher Art sein, z. B. vorübergehend oder dauerhaft, und wenn sie dauerhaft sind, müssen mehr Felder ausgefüllt werden, z. B. die Bürotelefonnummer, die nur dann nicht null sein sollte, wenn der Typ = "Fest" ist. In einer dritten Normalformulardatenbank sollte die Spalte nur vom Schlüssel abhängen, dh vom Mitarbeiter, aber tatsächlich vom Mitarbeiter und Typ. Daher ist eine 1: 1-Beziehung völlig normal und in diesem Fall wünschenswert. Es verhindert auch zu spärliche Tabellen, wenn ich 10 Spalten habe, die normalerweise gefüllt sind.
quelle
Das häufigste Szenario, an das ich denken kann, ist, wenn Sie BLOBs haben. Angenommen, Sie möchten große Bilder in einer Datenbank speichern (normalerweise nicht die beste Methode, um sie zu speichern, aber manchmal machen es die Einschränkungen bequemer). Normalerweise möchten Sie, dass sich der Blob in einer separaten Tabelle befindet, um die Suche nach Nicht-Blob-Daten zu verbessern.
quelle
In Bezug auf die reine Wissenschaft sind sie nutzlos.
In realen Datenbanken ist es manchmal nützlich, ein selten verwendetes Feld in einer separaten Tabelle zu speichern: um Abfragen mit diesem und nur diesem Feld zu beschleunigen; um Schlösser usw. zu vermeiden
quelle
Anstatt Ansichten zu verwenden, um den Zugriff auf Felder einzuschränken, ist es manchmal sinnvoll, eingeschränkte Felder in einer separaten Tabelle zu speichern, auf die nur bestimmte Benutzer Zugriff haben.
quelle
Ich kann mir auch Situationen vorstellen, in denen Sie ein OO-Modell haben, in dem Sie Vererbung verwenden, und der Vererbungsbaum für die Datenbank beibehalten werden muss.
Zum Beispiel haben Sie eine Klasse Vogel und Fisch, die beide von Tier erben. In Ihrer Datenbank können Sie eine 'Animal'-Tabelle haben, die die allgemeinen Felder der Animal-Klasse enthält, und die Animal-Tabelle hat eine Eins-zu-Eins-Beziehung zur Bird-Tabelle und eine Eins-zu-Eins-Beziehung zum Fisch Tabelle.
In diesem Fall muss keine einzige Animal-Tabelle vorhanden sein, die viele nullbare Spalten enthält, um die Bird- und Fish-Eigenschaften zu speichern. Alle Spalten, die Fish-Daten enthalten, werden auf NULL gesetzt, wenn der Datensatz einen Vogel darstellt.
Stattdessen haben Sie einen Datensatz in der Birds-Tabelle, der eine Eins-zu-Eins-Beziehung zu dem Datensatz in der Animal-Tabelle hat.
quelle
1-1-Beziehungen sind auch erforderlich, wenn Sie zu viele Informationen haben. Für jeden Datensatz in der Tabelle gibt es eine Beschränkung der Datensatzgröße. Manchmal werden Tabellen in zwei Teile geteilt (mit den am häufigsten abgefragten Informationen in der Haupttabelle), damit die Datensatzgröße nicht zu groß wird. Datenbanken sind auch effizienter bei der Abfrage, wenn die Tabellen eng sind.
quelle
Es ist auch eine Möglichkeit, eine Tabelle, die bereits in Produktion ist, mit weniger (wahrgenommenem) Risiko als eine "echte" Datenbankänderung zu erweitern. Das Anzeigen einer 1: 1-Beziehung in einem Legacy-System ist häufig ein guter Indikator dafür, dass Felder nach dem ersten Entwurf hinzugefügt wurden.
quelle
In SQL ist es unmöglich, eine 1: 1-Beziehung zwischen zwei Tabellen zu erzwingen, die auf beiden Seiten obligatorisch ist (es sei denn, die Tabellen sind schreibgeschützt). Für die meisten praktischen Zwecke bedeutet eine "1: 1" -Beziehung in SQL wirklich 1: 0 | 1.
Die Unfähigkeit, die obligatorische Kardinalität bei referenziellen Einschränkungen zu unterstützen, ist eine der schwerwiegenden Einschränkungen von SQL. "Aufschiebbare" Einschränkungen zählen nicht wirklich, da sie nur eine Art zu sagen sind, dass die Einschränkung manchmal nicht erzwungen wird.
quelle
Wenn Sie die Daten mit einem der gängigen ORMs verwenden, möchten Sie möglicherweise eine Tabelle in mehrere Tabellen aufteilen, um sie Ihrer Objekthierarchie anzupassen.
quelle
Ich habe festgestellt, dass eine 1: 1-Beziehung ausschließlich aus systemischen Gründen und nicht aus relationalen Gründen erfolgt.
Ich habe zum Beispiel festgestellt, dass das Einfügen der reservierten Aspekte eines Benutzers in eine Tabelle und das Einfügen der vom Benutzer bearbeitbaren Felder des Benutzers in eine andere Tabelle das logische Schreiben dieser Regeln über Berechtigungen für diese Felder viel einfacher macht.
Aber Sie haben Recht, theoretisch sind 1: 1-Beziehungen vollständig erfunden und fast ein Phänomen. Logischerweise können die Programme und Optimierungen die Datenbank jedoch leichter abstrahieren.
quelle
Meistens wird angenommen, dass Designs 1: 1 sind, bis jemand fragt: "Warum kann es nicht 1: viele sein?" Die vorzeitige Trennung der Konzepte erfolgt im Vorgriff auf dieses gemeinsame Szenario. Person und Adresse sind nicht so eng miteinander verbunden. Viele Leute haben mehrere Adressen. Und so weiter...
Normalerweise implizieren zwei separate Objekträume, dass einer oder beide multipliziert werden können (x: viele). Wenn zwei Objekte wirklich, wirklich 1: 1 waren, sogar philosophisch, dann ist es eher eine Is-Beziehung. Diese beiden "Objekte" sind tatsächlich Teile eines ganzen Objekts.
quelle
erweiterte Informationen, die nur in bestimmten Szenarien benötigt werden. In älteren Anwendungen und Programmiersprachen (z. B. RPG), in denen die Programme über die Tabellen kompiliert werden (wenn sich die Tabelle ändert, müssen Sie die Programme neu kompilieren). Das Begleiten von Dateien kann auch in Fällen hilfreich sein, in denen Sie sich Gedanken über die Tabellengröße machen müssen.
quelle
Am häufigsten ist es eher eine physische als eine logische Konstruktion. Es wird häufig verwendet, um eine Tabelle vertikal zu partitionieren, um die E / A-Aufteilung auf physische Geräte oder andere Abfrageoptimierungen zu nutzen, die mit der Trennung von Daten verbunden sind, auf die weniger häufig zugegriffen wird, oder von Daten, die sicherer als die übrigen Attribute desselben Objekts aufbewahrt werden müssen (SSN, Gehalt usw.).
Die einzige logische Überlegung, die eine 1-1-Beziehung vorschreibt, ist, wenn bestimmte Attribute nur für einige der Entitäten gelten. In den meisten Fällen gibt es jedoch eine bessere / normalisierte Möglichkeit, die Daten durch Entitätsextraktion zu modellieren.
quelle
Der beste Grund, den ich für eine 1: 1-Beziehung sehen kann, ist ein SuperType-Subtyp des Datenbankdesigns. Ich habe eine Real Estate MLS-Datenstruktur basierend auf diesem Modell erstellt. Es gab fünf verschiedene Datenfeeds; Wohnen, Gewerbe, Mehrfamilienhaus, Hotels & Land.
Ich habe einen SuperType namens Eigenschaft erstellt, der Daten enthält, die jedem der fünf separaten Datenfeeds gemeinsam sind. Dies ermöglichte sehr schnelle "einfache" Suchen über alle Datentypen hinweg.
Ich erstelle fünf separate Subtypen, in denen die eindeutigen Datenelemente für jeden der fünf Datenfeeds gespeichert sind. Jeder SuperType-Datensatz hatte eine 1: 1-Beziehung zum entsprechenden SubType-Datensatz.
Wenn ein Kunde eine detaillierte Suche wünschte, musste er einen Super-Sub-Typ auswählen, beispielsweise PropertyResidential.
quelle
Meiner Meinung nach bildet eine 1: 1-Beziehung eine Klassenvererbung auf einem RDBMS ab. Es gibt eine Tabelle A, die die allgemeinen Attribute enthält, dh den Status der Teilklasse. Jeder geerbte Klassenstatus wird auf dem RDBMS mit einer Tabelle B mit einer 1: 1-Beziehung zu einer Tabelle zugeordnet, die die speziellen Attribute enthält. Der Tabellenname A enthält auch ein "Typ" -Feld, das die "Casting" -Funktionalität darstellt
Tschüss Mario
quelle
Sie können eine Eins-zu-Eins-Beziehungstabelle erstellen, wenn sich ein erheblicher Leistungsvorteil ergibt. Sie können die selten verwendeten Felder in eine separate Tabelle einfügen.
quelle
1: 1-Beziehungen sind nicht wirklich sinnvoll, wenn Sie sich für Normalisierung interessieren, da alles, was 1: 1 wäre, in derselben Tabelle gespeichert wird.
In der realen Welt ist es jedoch oft anders. Möglicherweise möchten Sie Ihre Daten so aufteilen, dass sie mit Ihrer Anwendungsoberfläche übereinstimmen.
quelle
Möglicherweise, wenn Ihre Datenbank typisierte Objekte enthält.
Angenommen, in einer Tabelle T1 haben Sie die Spalten C1, C2, C3… mit einer Eins-zu-Eins-Beziehung. Es ist in Ordnung, es ist in normalisierter Form. Angenommen, Sie haben in einer Tabelle T2 die Spalten C1, C2, C3, ... (die Namen können unterschiedlich sein, aber die Typen und die Rolle sind gleich) mit einer Eins-zu-Eins-Beziehung. Es ist für T2 aus den gleichen Gründen wie für T1 in Ordnung.
In diesem Fall sehe ich jedoch eine Anpassung für eine separate Tabelle T3, die C1, C2, C3… und eine Eins-zu-Eins-Beziehung von T1 zu T3 und von T2 zu T3 enthält. Ich sehe noch mehr eine Übereinstimmung, wenn es eine andere Tabelle gibt, mit der es bereits eine Eins zu mehreren C1, C2, C3 gibt ... sagen wir von Tabelle A zu mehreren Zeilen in Tabelle B. Dann verwenden Sie anstelle von T3 B und haben eine Eins-zu-Eins-Beziehung von T1 nach B, die gleiche für von T2 nach B und immer noch die gleiche Eins-zu-Mehrfach-Beziehung von A nach B.
Ich glaube, dass die Normalisierung damit nicht einverstanden ist, und das kann eine Idee außerhalb davon sein: Objekttypen identifizieren und Objekte desselben Typs in ihren eigenen Speicherpool verschieben, wobei eine Eins-zu-Eins-Beziehung aus einigen Tabellen und eine Eins-zu-Mehrfach-Beziehung verwendet wird Beziehung aus einigen anderen Tabellen.
quelle
Es ist aus Sicherheitsgründen unnötig gut, aber es gibt bessere Möglichkeiten, Sicherheitsüberprüfungen durchzuführen. Stellen Sie sich vor, Sie erstellen einen Schlüssel, der nur eine Tür öffnen kann. Wenn der Schlüssel eine andere Tür öffnen kann, sollten Sie den Alarm auslösen. Im Wesentlichen können Sie "CitizenTable" und "VotingTable" haben. Citizen One-Stimme für Kandidat Eins, die in der Abstimmungstabelle gespeichert ist. Wenn Bürger eins wieder in der Abstimmtabelle erscheint, sollte dies ein Alarm sein. Seien Sie beraten, dies ist eine Eins-zu-Eins-Beziehung, da wir uns nicht auf das Kandidatenfeld beziehen, sondern auf die Abstimmtabelle und die Bürgertabelle.
Beispiel:
Wenn wir dann die Abstimmungstabelle so sehen:
Wir könnten sagen, dass Bürger Nummer 3 eine brennende Lügnerhose ist, die Bern Nie betrogen hat. Nur ein Beispiel.
quelle
Wenn Sie mit einer Datenbank eines Drittanbieterprodukts arbeiten, möchten Sie deren Datenbank wahrscheinlich nicht ändern, um eine enge Kopplung zu verhindern. Möglicherweise haben Sie jedoch Daten, die 1: 1 mit ihren Daten übereinstimmen
quelle
Überall waren zwei völlig unabhängige Einheiten eine Eins-zu-Eins-Beziehung. Es muss viele Beispiele geben:
Person <-> Zahnarzt (es ist 1: N, also ist es falsch!)
Person <-> Arzt (es ist 1: N, also ist es auch falsch!)
Person <-> Ehepartner (es ist 1: 0 | 1, also ist es meistens falsch!)
EDIT: Ja, das waren ziemlich schlechte Beispiele, besonders wenn ich immer nach einem 1: 1 gesucht habe, nicht nach einer 0 oder 1 auf beiden Seiten. Ich denke mein Gehirn hat falsch geschossen :-)
Also werde ich es noch einmal versuchen. Nach einigem Überlegen stellt sich heraus, dass die einzige Möglichkeit, zwei separate Entitäten zu haben, die (soweit es die Software betrifft) die ganze Zeit zusammen sein müssen, darin bestehen, dass sie in einer höheren Kategorisierung zusammen existieren. Dann, wenn und nur wenn Sie in eine niedrigere Zersetzung fallen, sind und sollten die Dinge getrennt sein, aber auf der höheren Ebene können sie nicht ohne einander leben. Kontext ist dann der Schlüssel.
In einer medizinischen Datenbank möchten Sie möglicherweise verschiedene Informationen zu bestimmten Körperregionen speichern und diese als separate Einheit aufbewahren. In diesem Fall hat ein Patient nur einen Kopf, und er muss ihn haben, oder er ist kein Patient. (Sie haben auch ein Herz und eine Reihe anderer notwendiger Einzelorgane). Wenn Sie beispielsweise Operationen verfolgen möchten, sollte jede Region eine eindeutige Einheit sein.
Wenn Sie in einem Produktions- / Inventarsystem die Montage von Fahrzeugen verfolgen, möchten Sie sicherlich den Motorfortschritt anders als bei der Karosserie verfolgen, es besteht jedoch eine Eins-zu-Eins-Beziehung. Eine Pflege muss einen Motor haben und nur einen (sonst wäre es kein "Auto" mehr). Ein Motor gehört nur einem Auto.
In jedem Fall könnten Sie die einzelnen Entitäten als einen großen Datensatz erstellen, aber angesichts des Zerlegungsgrades wäre das falsch. In diesen spezifischen Kontexten sind sie wirklich unabhängige Einheiten, obwohl sie auf einer höheren Ebene möglicherweise nicht so erscheinen.
Paul.
quelle