Datenbankentwurf - Verwenden Sie eine FK oder eine separate Tabelle?

  • Angenommen, ich habe eine Tabelle mit dem Namen 'A'. Tabelle 'A' kann entweder eine 1: 0 oder 1: 1-Beziehung zu Tabelle 'B' haben. Etwa 95% der Zeilen in Tabelle 'A' haben keinen Bezug zu einer Zeile in Tabelle 'B'.

    Ich kann dies auf zwei verschiedene Arten tun.

    1

    In Tabelle 'A' könnte ich eine FK-Spalte für Tabelle 'B' haben. Ungefähr 95% der Zeilen enthalten jedoch einen NULL-Wert in dieser FK-Spalte.

    2

    Ich könnte eine Tabelle 'C' erstellen, die eine FK-Spalte mit der Tabelle 'A' und eine FK-Spalte enthält Tisch 'B'. Ich würde der Tabelle 'C' nur dann eine Zeile hinzufügen, wenn ich eine Beziehung zwischen den Tabellen 'A' und 'B' habe.

    sollte ich Erwähnen Sie auch, dass eine Zeile in Tabelle 'B' auf viele Zeilen in Tabelle 'A' zeigen könnte.

    Welches wäre der bevorzugte Weg, dies zu behandeln?

    22 November 2011
    Hosea146
2 answers
  • Update: Sie haben ein N: 0..1 (das sich von 1: 0..1 unterscheidet). In diesem Fall sind Ihre 2 Lösungen die einzig möglichen Lösungen. In der Praxis hängt es wahrscheinlich davon ab, welchen Fall Sie optimieren möchten. Ich würde für die Einfachheit eine Tabelle weniger wählen.

    Normalerweise würde die Einfachheit von Lösung 1 dies vorziehen. Sie können Joins problemlos mit Tabelle B erstellen und Sie können ohne Joins nach NULL / NOT NULL filtern.

    In der Theorie liegt Lösung 2 näher am theoretischen Normalisierungsideal; In der Praxis ist es komplex und die einzige Situation, die ich mir vorstellen kann, ist besser, wenn der Platz knapp ist und Ihre Tische wirklich sehr groß sind. Wenn dies jedoch der Fall ist, müssen Sie wahrscheinlich zu einem NO-SQL-Schema wechseln.

    BEARBEITEN: DIESER ABSATZ IST NICHT GÜLTIG: Sie haben keine andere mögliche Lösung. Haben Sie einen Fremdschlüssel in B, der auf A zeigt. Nach dem, was Sie in Ihrer Frage sagen, scheint jeder Datensatz in B einen Datensatz in A zu haben. Daher können Sie von B auf den Primärschlüssel in A zeigen, und es wird kein leere Datensätze in einer Tabelle. Natürlich verlieren Sie die Möglichkeit, die Datensätze in A ohne ein entsprechendes B ohne Join zu überprüfen.

    Um zu entscheiden, welche Strategie verwendet werden soll, müssen Sie möglicherweise genauer festlegen, was Sie abfragen möchten, und Ihre Anwendungsfälle. Sie können dann für eine bestimmte Strategie optimieren.

    22 November 2011
    Luis
  • Ich würde die erste nicht empfehlen.

    Stattdessen würde ich empfehlen, dass Tabelle B eine FK zu Tabelle A enthält, dann etwa 5% der Zeilen in B NULL enthalten, wenn keine Beziehung zutrifft.

    Der zweite Ansatz der dritten Tabelle C ist mehr normalisiert, der Kompromiss besteht jedoch darin, bei jeder Abfrage der Beziehung einen zusätzlichen Join durchzuführen .

    22 November 2011
    Gabriel Belingueres