Gibt es jemals eine Zeit, in der die Verwendung einer 1: 1-Datenbankbeziehung sinnvoll ist?


162

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?


7
SSNs sind keine eindeutigen Nummern. Sie werden wiederverwendet.

Es ist einfacher, die Datenbank in mehrere physische Geräte aufzuteilen, wenn sie so getrennt ist.
Pacerier

2
Bitte entschuldigen Sie einen Kommentar zu einem wirklich alten Kommentar oben: SSNs werden nicht wiederverwendet und identifizieren eine Person tatsächlich eindeutig.
Derek

Richtig, aber basierend auf einigen Berechnungen auf der Rückseite des Umschlags wurde bereits etwa die Hälfte der möglichen Zahlen ausgegeben. Die SSA behauptet, dass es noch einige Generationen lang genug geben wird, aber früher oder später werden ihnen die Zahlen ausgehen, sofern sich die Richtlinien / Gesetze nicht ändern. Weitere Informationen
Pulsehead

2
Sie können sich vorstellen, in welcher Stimmung Mark Brady am 5. Februar 2009 zwischen 23:10 und 23:33 Uhr war. Hehe.
Robert

Antworten:


161

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.


32
Ein perfektes Beispiel hierfür könnte eine Tabelle sein, die Dateien enthält. Möglicherweise möchten Sie (aus offensichtlichen Gründen) eine Tabelle haben, die nur die Metadaten der Datei enthält (Dateiname, MIME-Typ usw.), und eine andere Tabelle, die 1: 1 zugeordnet ist und die tatsächlichen Blob-Daten enthält. Dies würde in einigen Fällen den Aufwand beim Abfragen / Sortieren der Dateien verringern.
Kevin Peno

2
Ja. Dies hängt von der Datenbank ab (moderne Designs speichern Blobs im Dateisystem nur unter Verwendung des richtigen Typs), und selbst bei einer solchen Unterstützung muss darauf geachtet werden, die Spalten auszuschließen (in SQL sind explizite Spaltenlisten normal, aber einige ORMs möchten ziehen die gesamte Aufzeichnung). Der Trick besteht darin, Ihr Verwendungsmuster zu kennen: Wenn die tatsächlichen Daten die meiste Zeit ignoriert werden, würde ich eine 1: 1-Blob-Tabelle verwenden. Wenn die meisten Zugriffe Downloads der Daten sind, würde ich den nativen Speichermechanismus verwenden.
Godeke

@Ochado Obwohl ich damit einverstanden bin, dass Sie viele natürlich vorkommende (nicht physische) Gründe für 1: 1 haben, führt die Kavate "Wenn Sie keine historischen Informationen haben" zu Fällen, zu denen ich wahrscheinlich keine 1: 1-Beziehung verwenden würde erzwingen.
Godeke

1
@Ochado Ich denke jedoch, dass die IS-A-Beziehung ein gutes Beispiel ist. Ich versuche zu vermeiden, objektorientierte Konzepte in meine Tabellen zu zwingen (stattdessen ein ORM als Datenbibliothek zu verwenden), aber ich habe Fälle gesehen, in denen ich versucht war. Die Leistung solcher Systeme im Maßstab tötete diese Experimente jedoch. Dennoch ist dies wahrscheinlich das beste Beispiel für ein nicht leistungsbezogenes Beispiel.
Godeke

Tatsächlich würden das IS-A- und auch die übereinstimmenden Reservierungsszenarien wahrscheinlich 1: 1 bleiben, selbst wenn historische Daten gespeichert werden.
Tripartio

125

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.


1
Ja, ich wünschte, das OP könnte dies als zweite akzeptierte Antwort markieren. Mein erster Gedanke beim Lesen dieser Frage war "Zeilensperren".
Ricket

47

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.


8
"aber entsprechende Zeilen müssen nicht für jede Zeile existieren" Dann ist das nicht 1: 1. Sie sprechen von 1: 0,1.

1
Ja. Keine Ahnung, ob das OP die Unterscheidung trifft.
Chaos

2
Nun, ich würde annehmen, dass sie es getan haben, weil 1: 0,1 viele Verwendungszwecke hat, einschließlich Ihrer, aber 1: 1 hat weit weniger. Und sie hatten Mühe, Verwendungszwecke zu finden, also würde ich sagen, dass das OP die Unterscheidung getroffen hat.

12
Meine Arbeitsannahme war das Gegenteil, weil er 1: 1, 1: viele und viele: viele aufzählte, ohne 1: 0,1 zu erwähnen.
Chaos

26

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.


2
Ich mag es wirklich, wie Sie an dem ursprünglichen Fragengeist festgehalten haben, wann eine solche Beziehung korrekt ist und nicht, wenn sie aus irdischen Gründen wie der physischen Natur von Computern nützlich ist.
user1852503

21

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.


19

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.


1
@ShaneD +1 für ein echtes Wortbeispiel. Ich mag auch die Unterscheidung "Schreibgeschützt".
Michael Riley - AKA Gunny

13

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.


Ernsthaft? Normalerweise nicht der beste Weg? Der größte Online-Musikanbieter speichert MP3s in einer Datenbank.

1
@Mark, es gibt einige Fragen, die sich mit der besten Möglichkeit befassen, Bilder entweder in einer Datenbank oder außerhalb zu speichern, und es scheint Konsens darüber zu bestehen, dass das Dateisystem größtenteils schneller ist. Ich stelle mir vor, wenn das tatsächlich stimmt, dann gilt das auch für MP3s.
James McMahon

1
"Normalerweise möchten Sie das BLOB in einer separaten Tabelle" - Normalerweise werden BLOBs nicht inline gespeichert (wenn sie eine bestimmte db-spezifische Zeilenlänge überschreiten). Wenn BLOBs nicht inline sind, werden sie normalerweise als 'Zeiger' auf ihren physischen Speicherort auf den DB-Seiten gespeichert.
Blispr

1
Es ist fraglich, ob es sinnvoll ist, große Daten (Dateien) in einer Datenbank zu speichern, einige sind für einige gegen alle gültige Gründe, aber +1 für das Beispiel eines 1: 1.
Kevin Peno

Dies sollte wirklich eine eigene Frage sein, die ich gerne sehen würde. Mit Beiträgen von intelligenten Leuten, die die Zeit / Prestanda für verschiedene Festplatten / OS / RDBMS messen. Es sollte eine endgültige Antwort auf diese Frage geben, es sollte nicht streitig sein, wenn es richtig gemessen wird. Hat es noch niemand getan?
Stefan

9

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


3
@ Mark Brady: Nein, das tut es nicht, da es Na2SO4 und KCl gibt. Wenn Sie eine Universumsdatenbank erstellen, sollten Sie t_atom (id INT, Protonen INT, Neutronen INT), t_molecule (id INT, atom_id INT) erstellen und Verknüpfungen herstellen. Es ist eine Eins-zu-Viele-Beziehung.
Quassnoi

2
Bei einem zweiten Gedanken könnte INT hier nicht ausreichen, da es 10 ^ 78 Atome im Universum gibt. Selbst zwei zusammengeklebte GUIDs können nur 1/10 der Atome aufnehmen. Wir benötigen einen RAW (40) -Primärschlüssel - nur für den Fall, dass unsere Datenbank zu schnell wächst. Dunkle Materie, weißt du, von etwas.
Quassnoi

1
Oh, also ist nur die relationale Theorie reine Wissenschaft. Ich wusste nicht, dass Chemie keine reine Wissenschaft ist, es sei denn, wir haben eine Datenbank dafür erstellt.

1
@ Mark Brady: Könntest du nicht bitte einfach sagen, womit du nicht einverstanden bist? Ich verstehe deinen Sarkasmus nicht wirklich :)
Quassnoi

Quassnoi (und Mark Brady) Sie erhalten eine Gegenstimme für die LOL, die Sie mir gerade gegeben haben.
Pulsehead

8

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.


8

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.


Diese Antwort bezieht sich auf eine andere Frage: die der Beziehung 1 zu 0-1.
Hibou57

8

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.


6

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.


Warum nicht eindeutig? Denken Sie, dass ein brandneuer Tisch genauso riskant ist wie die Veränderung eines vorhandenen Tisches? Bitte listen Sie die Dinge auf, die beim Hinzufügen neuer Tabellen kaputt gehen. Das einzige, was mir einfällt, ist Code, der über Metadaten arbeitet, dh SELECT * From USER_TABLES loop <something> end loop.

1
Es ist weniger so, dass Dinge kaputt gehen, als dass es oft mehr Arbeit kostet, eine 1: 1-Tabelle richtig hinzuzufügen, als ein zusätzliches Feld hinzuzufügen. Jetzt bedeutet ein neuer Datensatz, dass zwei Tabellen anstelle von nur einer aktualisiert werden. Datensatz löschen? Zwei Abfragen ebenfalls. Jetzt pflegen wir mehr Code, anstatt ihn einmal zu ändern.
JT Grimes

@ Mark Brady, stark typisierte Datensätze können eine Hölle sein, wenn Sie ein paar Dateien in die Datenbank einfügen. Wenn ein Tableadapter im Dataset viele Abfragen usw. enthält, ist es viel einfacher, einfach die neue Tabelle zu ziehen und fertig.
Stefan

@Stefan: Es gibt keine Kaskadeneinfügung.
JT Grimes

@ Boofus, na ja ... manchmal müssen wir die Tastatur benutzen und ein wenig für das Geld programmieren, das wir verdienen. ;)
Stefan

5

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.


4

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.


3
Trauriger, trauriger Grund. Wenn ein ORM eine Abweichung zwischen dem Objektmodell und dem physischen Speicher nicht bewältigen kann, dann ... nur traurig.

Wenn ich das richtig verstehe, bedeutet dies, dass Klassifizierungserbschaften in der relationalen Datenbank implementiert werden. Dies ist ein absolut legitimer und natürlicher Fall von 1: 1-Beziehungen. Daran ist nichts "Trauriges".
Tripartio

4

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.


Phänomen: ist eine Tatsache oder ein Ereignis von wissenschaftlichem Interesse, das wissenschaftlich beschrieben und / oder erklärt werden kann. Ich glaube nicht, dass Sie dieses Wort verwenden wollten.

1
Ich wollte es in seiner Konnotation als seltene Sache benutzen. In der Regel wird das Phänomen verwendet, um Ausreißer zu beschreiben, obwohl seine Definition Ihre Notwendigkeit definiert, jedes Wort in meinem Beitrag zu korrigieren.
DevelopingChris

@DevelopingChris Ich stimme zu, dass 1: 1 ein Phänomen sind. Mit Ausnahme der Schultheorie gibt es nur sehr wenige reale Situationen.
Michael Riley - AKA Gunny

4

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.


3

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.


2

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.


2

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.


1

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


1

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.


0

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.


Ich bin mit der Ein-Tisch-Theorie nicht einverstanden. Es gibt Zeiten, in denen eine SuperType-Subtyp-Beziehung am besten mit 1: 1-Beziehungen ausgedrückt wird.
Michael Riley - AKA Gunny

1
Wenn Sie sich für eine extreme Normalisierung entscheiden würden, hätten Sie viel mehr 1: 1-Beziehungen. Frühe Formen der Normalisierung, die von Date vorgeschlagen wurden, enthielten die Regel, dass keine Spalte NULL zulassen sollte. Das heißt, wenn eine Spalte für eine Tabelle NULL sein könnte, sollte sie sich in einer eigenen Tabelle befinden und eine Zeile nur hinzugefügt werden, wenn sie bewertet wurde. Diese Regel wurde größtenteils verworfen, auch von Codd.
Tom H

0

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.


0

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:

 Citizen Table
 id = 1, citizen_name = "EvryBod"
 id = 2, citizen_name = "Lesly"
 id = 3, citizen_name = "Wasserman"

 Candidate Table
 id = 1, citizen_id = 1, candidate_name = "Bern Nie"
 id = 2, citizen_id = 2, candidate_name = "Bern Nie"
 id = 3, citizen_id = 3, candidate_name = "Hill Arry"

Wenn wir dann die Abstimmungstabelle so sehen:

 Voting Table
 id = 1, citizen_id = 1, candidate_name = "Bern Nie"
 id = 2, citizen_id = 2, candidate_name = "Bern Nie"
 id = 3, citizen_id = 3, candidate_name = "Hill Arry"
 id = 4, citizen_id = 3, candidate_name = "Hill Arry"
 id = 5, citizen_id = 3, candidate_name = "Hill Arry"

Wir könnten sagen, dass Bürger Nummer 3 eine brennende Lügnerhose ist, die Bern Nie betrogen hat. Nur ein Beispiel.


0

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


-4

Ü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.


Ein Zahnarzt hat einen Patienten? Ein Arzt hat nur einen Patienten? Person zu Ehepartner in nur 1: 1, wenn Sie 1 Ehepartner in einen Tisch und den anderen Ehepartner in einen anderen setzen (ich wollte Männer in einem und Frauen in dem anderen sagen. Na ja)

Mark, Sie könnten einfach eine "Couples" -Tabelle erstellen, in der Zeilen immer paarweise vorliegen. Aber sonst stimme ich Ihnen zu, ähm. : P
JohannesH

Ja, ich stimme auch Mark zu. :-) (Darf ich meine eigene dumme Antwort ablehnen?)
Paul W Homer

Ja, die "Dummheit" zu beweisen, beweist, wie klug du bist. Die echten Feiglinge löschen ihre dummen Antworten ... gut, dass sie keine Ärzte sind und Krankenakten löschen. Eigentlich ist es gut, dass wir es auch nicht sind. Neustart wäre eine schlechte medizinische Behandlung.

2
Ich habe immer gedacht, dass selbst die klügste Person der Welt (wer auch immer das zu diesem Zeitpunkt sein mag) immer noch ihre Momente der Euterdummheit hat. Es ist ein menschlicher Fluch :-) Während mein Computer Momente der Intelligenz hat.
Paul W Homer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.