1: 1 Fremdschlüsseleinschränkungen

8

Wie legen Sie fest, dass eine Fremdschlüsseleinschränkung in transact sql eine 1: 1-Beziehung sein sollte? Erklärt die Spalte UNIQUE genug? Unten ist mein bestehender Code.!

%Vor%     
homeskillet 28.08.2008, 14:16
quelle

5 Antworten

9

Eine Fremdschlüsselspalte mit den UNIQUE- und NOT NULL-Integritätsbedingungen, die auf eine UNIQUE, NOT NULL-Spalte in einer anderen Tabelle verweisen, erstellt eine 1: (0 | 1) -Beziehung, die Sie wahrscheinlich verwenden möchten.

Wenn es eine echte 1: 1-Beziehung gäbe, hätte jeder Datensatz in der ersten Tabelle einen entsprechenden Datensatz in der zweiten Tabelle und umgekehrt. In diesem Fall würden Sie wahrscheinlich nur eine Tabelle erstellen wollen (außer Sie benötigen eine seltsame Speicheroptimierung).

    
Neall 28.08.2008, 14:24
quelle
4

Sie können die Spalte sowohl als Primärschlüssel als auch als Fremdschlüssel deklarieren. Dies ist eine gute Strategie für "Extension" -Tabellen, die verwendet werden, um das Einfügen von nullwertfähigen Spalten in die Haupttabelle zu vermeiden.

    
Eric Z Beard 28.08.2008 14:19
quelle
1

@bosnic:

  

Sie haben eine Tabelle CLIENT, die eine 1: 1-Beziehung mit der Tabelle SALES_OFFICE hat, weil zum Beispiel die Logik Ihres Systems dies sagt.

Was Ihre App-Logik sagt und was Ihr Datenmodell sagt, sind zwei verschiedene Dinge. Es ist nichts falsch daran, diese Beziehung mit Ihrem Geschäftslogikcode zu erzwingen, aber sie hat keinen Platz im Datenmodell.

  

Würden Sie die Daten von SALES_OFFICE wirklich in die CLIENT-Tabelle integrieren?

Wenn jeder CLIENT einen eindeutigen SALES_OFFICE hat und jeder SALES_OFFICE einen singulären, eindeutigen CLIENT hat - dann sollten sie sich in derselben Tabelle befinden. Wir brauchen nur einen besseren Namen. ;)

  

Und wenn andere Tabellen sie mit SALES_OFFICE in Beziehung setzen müssen?

Es gibt keinen Grund dazu. Verknüpfen Sie Ihre anderen Tabellen mit CLIENT, da CLIENT über ein eindeutiges SALES_OFFICE verfügt.

  

Und was ist mit den Best Practices und Mustern für die Normalisierung von Datenbanken?

Dies ist Normalisierung.

Um fair zu sein, SALES_OFFICE und CLIENT sind offensichtlich keine 1: 1 Beziehung - es ist 1: N. Hoffentlich ist Ihr SALES_OFFICE vorhanden, um mehr als einen Client zu bedienen, und wird (zumindest für eine Weile) ohne Clients bestehen bleiben.

Ein realistischeres Beispiel ist SALES_OFFICE und ZIP_CODE. Ein SALES_OFFICE muss genau 1 ZIP_CODE und 2 SALES_OFFICEs haben - auch wenn sie einen äquivalenten ZIP_CODE haben - teilen Sie die Instanz eines ZIP_CODE nicht mit (also ändert sich der ZIP_CODE von 1 nicht auf den anderen). Würdest du nicht zustimmen, dass ZIP_CODE als Spalte in SALES_OFFICE gehört?

    
Mark Brackett 28.08.2008 16:45
quelle
0
___ answer32372 ___

Sie können die Spalte sowohl als Primärschlüssel als auch als Fremdschlüssel deklarieren. Dies ist eine gute Strategie für "Extension" -Tabellen, die verwendet werden, um das Einfügen von nullwertfähigen Spalten in die Haupttabelle zu vermeiden.

    
___ qstnhdr ___ 1: 1 Fremdschlüsseleinschränkungen ___ answer32394 ___

Eine Fremdschlüsselspalte mit den UNIQUE- und NOT NULL-Integritätsbedingungen, die auf eine UNIQUE, NOT NULL-Spalte in einer anderen Tabelle verweisen, erstellt eine 1: (0 | 1) -Beziehung, die Sie wahrscheinlich verwenden möchten.

Wenn es eine echte 1: 1-Beziehung gäbe, hätte jeder Datensatz in der ersten Tabelle einen entsprechenden Datensatz in der zweiten Tabelle und umgekehrt. In diesem Fall würden Sie wahrscheinlich nur eine Tabelle erstellen wollen (außer Sie benötigen eine seltsame Speicheroptimierung).

    
___ tag123sql ___ Structured Query Language (SQL) ist eine Sprache für die Abfrage von Datenbanken. Fragen sollten Codebeispiele, Tabellenstruktur, Beispieldaten und ein Tag für die verwendete DBMS-Implementierung (z. B. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 usw.) enthalten. Wenn sich Ihre Frage nur auf ein bestimmtes DBMS bezieht (verwendet bestimmte Erweiterungen / Funktionen), verwenden Sie stattdessen das Tag des DBMS. Antworten auf mit SQL gekennzeichnete Fragen sollten den ISO / IEC-Standard SQL verwenden. ___ answer32771 ___

@bosnic:

  

Sie haben eine Tabelle CLIENT, die eine 1: 1-Beziehung mit der Tabelle SALES_OFFICE hat, weil zum Beispiel die Logik Ihres Systems dies sagt.

Was Ihre App-Logik sagt und was Ihr Datenmodell sagt, sind zwei verschiedene Dinge. Es ist nichts falsch daran, diese Beziehung mit Ihrem Geschäftslogikcode zu erzwingen, aber sie hat keinen Platz im Datenmodell.

  

Würden Sie die Daten von SALES_OFFICE wirklich in die CLIENT-Tabelle integrieren?

Wenn jeder CLIENT einen eindeutigen SALES_OFFICE hat und jeder SALES_OFFICE einen singulären, eindeutigen CLIENT hat - dann sollten sie sich in derselben Tabelle befinden. Wir brauchen nur einen besseren Namen. ;)

  

Und wenn andere Tabellen sie mit SALES_OFFICE in Beziehung setzen müssen?

Es gibt keinen Grund dazu. Verknüpfen Sie Ihre anderen Tabellen mit CLIENT, da CLIENT über ein eindeutiges SALES_OFFICE verfügt.

  

Und was ist mit den Best Practices und Mustern für die Normalisierung von Datenbanken?

Dies ist Normalisierung.

Um fair zu sein, SALES_OFFICE und CLIENT sind offensichtlich keine 1: 1 Beziehung - es ist 1: N. Hoffentlich ist Ihr SALES_OFFICE vorhanden, um mehr als einen Client zu bedienen, und wird (zumindest für eine Weile) ohne Clients bestehen bleiben.

Ein realistischeres Beispiel ist SALES_OFFICE und ZIP_CODE. Ein SALES_OFFICE muss genau 1 ZIP_CODE und 2 SALES_OFFICEs haben - auch wenn sie einen äquivalenten ZIP_CODE haben - teilen Sie die Instanz eines ZIP_CODE nicht mit (also ändert sich der ZIP_CODE von 1 nicht auf den anderen). Würdest du nicht zustimmen, dass ZIP_CODE als Spalte in SALES_OFFICE gehört?

    
___ tag123sqlserver ___ Microsoft SQL Server ist ein relationales Datenbankverwaltungssystem (RDBMS). Verwenden Sie dieses Tag für alle SQL Server-Editionen, einschließlich Compact, Express, Azure, Fast-Track, APS (früher PDW) und Azure SQL DW. Verwenden Sie dieses Tag nicht für andere Arten von DBMS (MySQL, PostgreSQL, Oracle usw.). Verwenden Sie dieses Tag nicht für Probleme bei der Software- und mobilen Entwicklung, es sei denn, es steht in direktem Zusammenhang mit der Datenbank. ___ antwort32380 ___

Basierend auf dem obigen Code wäre die eindeutige Einschränkung ausreichend, da die eindeutige eingeschränkte Spalte für jeden Primärschlüssel, den Sie in der Tabelle haben, ebenfalls eindeutig ist. Dies setzt auch voraus, dass in [OtherTable] die Spalte [OtherTableKey] der Primärschlüssel dieser Tabelle ist.

    
___ answer32632 ___
  

Wenn es eine echte 1: 1-Beziehung gäbe, hätte jeder Datensatz in der ersten Tabelle einen entsprechenden Datensatz in der zweiten Tabelle und umgekehrt. In diesem Fall würden Sie wahrscheinlich nur eine Tabelle erstellen wollen (außer Sie benötigen eine seltsame Speicheroptimierung).

Das ist sehr falsch. Lassen Sie mich Ihnen ein Beispiel geben. Sie haben eine Tabelle CLIENT, die eine 1: 1-Beziehung mit der Tabelle SALES_OFFICE hat, weil zB die Logik Ihres Systems dies sagt. Würden Sie die Daten von SALES_OFFICE wirklich in die CLIENT-Tabelle integrieren? Und wenn andere Tabellen sie mit SALES_OFFICE in Beziehung setzen müssen? Und was ist mit Best Practices und Mustern für die Normalisierung von Datenbanken?

  

Eine Fremdschlüsselspalte mit den UNIQUE- und NOT NULL-Bedingungen, die auf eine UNIQUE, NOT NULL-Spalte in einer anderen Tabelle verweisen, erstellt eine 1: (0 | 1) -Beziehung, die Sie wahrscheinlich möchten.

Der erste Teil Ihrer Antwort ist die richtige Antwort ohne den zweiten Teil, es sei denn, die Daten in der zweiten Tabelle sind wirklich eine Art von Informationen, die zur ersten Tabelle gehören und niemals von anderen Tabellen verwendet werden.

    
___ qstntxt ___

Wie legen Sie fest, dass eine Fremdschlüsseleinschränkung in transact sql eine 1: 1-Beziehung sein sollte? Erklärt die Spalte UNIQUE genug? Unten ist mein bestehender Code.!

%Vor%     
___
Peter Meyer 28.08.2008 14:21
quelle
0
  

Wenn es eine echte 1: 1-Beziehung gäbe, hätte jeder Datensatz in der ersten Tabelle einen entsprechenden Datensatz in der zweiten Tabelle und umgekehrt. In diesem Fall würden Sie wahrscheinlich nur eine Tabelle erstellen wollen (außer Sie benötigen eine seltsame Speicheroptimierung).

Das ist sehr falsch. Lassen Sie mich Ihnen ein Beispiel geben. Sie haben eine Tabelle CLIENT, die eine 1: 1-Beziehung mit der Tabelle SALES_OFFICE hat, weil zB die Logik Ihres Systems dies sagt. Würden Sie die Daten von SALES_OFFICE wirklich in die CLIENT-Tabelle integrieren? Und wenn andere Tabellen sie mit SALES_OFFICE in Beziehung setzen müssen? Und was ist mit Best Practices und Mustern für die Normalisierung von Datenbanken?

  

Eine Fremdschlüsselspalte mit den UNIQUE- und NOT NULL-Bedingungen, die auf eine UNIQUE, NOT NULL-Spalte in einer anderen Tabelle verweisen, erstellt eine 1: (0 | 1) -Beziehung, die Sie wahrscheinlich möchten.

Der erste Teil Ihrer Antwort ist die richtige Antwort ohne den zweiten Teil, es sei denn, die Daten in der zweiten Tabelle sind wirklich eine Art von Informationen, die zur ersten Tabelle gehören und niemals von anderen Tabellen verwendet werden.

    
Ivan Bosnic 28.08.2008 15:47
quelle

Tags und Links