Ich versuche, eine Datenbank zu entwerfen. Ich habe ein Design, das mir auf Fourth Normal Form normalisiert zu sein scheint - aber immer noch denke ich, ist gebrochen, und ich kann nicht für das Leben von mir erarbeiten, wie man es repariert.Wie sollte ich dieses Datenbankdesign normalisieren?
Hintergrund: Wir haben vier Arten von Tests und ein paar Dutzend Tests für jeden Typ. Wir führen die Tests in Stapeln durch, wobei jeder Stapel Tests nur eines Typs enthält. Ein Testergebnis gehört also zu einer Charge und gehört ebenfalls zu einem Test. Welche gibt eine Datenbank Plan etwas wie folgt aus:
Das Problem ist, dass dieser Entwurf für ein Ergebnis ermöglicht es, die für einen Test von Typ A ist, aber das Ergebnis ist in einem Batch für Typ B.
Eine Sache, die ich nicht tun kann, ist die Kombination der Test- und Batch-Tabellen in einer Tabelle. Jede Woche gibt es einen neuen Batch, während ein Test Monate oder Jahre dauert. Und ein Batch kann viele Tests enthalten (obwohl immer vom selben Typ), und ein Test wird normalerweise viele Male in vielen Batches durchgeführt.
Ich könnte eine Viele-zu-Viele-Verbindung zwischen Test und Batch einfügen, aber ich kann nicht sofort sehen, wie das alles helfen würde.
Gibt es eine saubere Möglichkeit, dies neu zu organisieren, so dass wir den kreisförmigen Join-Pfad nicht haben? Ist das notwendig? Oder wünschenswert?
Oder sollte ich einfach mit dem gehen, was ich habe, und aufhören, mir darüber Gedanken zu machen? :-)
[Edit 1] Beachten Sie, dass der Test Details darüber enthält, wie er läuft, wer gefundene Fehler behebt, usw., die über mehrere Batches konstant bleiben, so dass der Test unabhängig von Batches existieren muss nicht) laufen in
[Edit 2] es wurde darauf hingewiesen, dass es besser wäre, einen TestBatch Tisch zu haben, die uns diese Struktur gibt.
ich stimme dies eine gut Idee, aber das behebt das Problem nicht wirklich. Es verschiebt das Problem nur von Ergebnis zu TestBatch. Wir können jetzt einen TestBatch haben, der für einen Test vom Typ A ist, aber diesen TestBatch in einem Batch für Typ B hat.
[Edit 3] Dank @ philip-kelleys ausgezeichnetem Vorschlag, glaube ich, dass wir eine haben Antworten. Zunächst verbinden wir TestBatch direkt zurück nach Typ, also:
Dies gilt nicht sofort das Problem beheben. Tatsächlich macht es es noch schlimmer - es könnte jetzt einen Typ für den Test geben, einen anderen Typ für den Stapel und einen dritten Typ, der direkt aus dem TestBatch stammt.
Aber der zweite Schritt besteht darin, den Fremdschlüssel von TestBatch zu Test zu ändern, so dass es sowohl den Typ als auch die TestID enthält. Und den Fremdschlüssel in Batch zu ändern, um sowohl den Typ als auch die BatchID einzuschließen.
Auf diese Weise können wir sicher sein, dass der TestBatch den gleichen Typ wie der Test und der Batch hat.
Warten Sie, ich vermisse etwas. Wenn 'jeder Stapel Tests nur eines Typs 'enthält und' ein Testergebnis zu einem Stapel gehört ', wie kann dann ein' Ergebnis, das für einen Test vom Typ A ist 'in einem Stapel für Typ B sein? –
In der realen Welt - kann es nicht. Jedes Ergebnis ist für einen bestimmten Test und einen bestimmten Batch, und dieser Test und dieser Batch * müssen * vom gleichen Typ sein. In meinem Datenbank-Design - es ist einfach, ein Ergebnis für einen Test des Typs A zu haben, aber das Ergebnis ist in einer Charge von Typ B. Und deshalb denke ich, mein Design ist gebrochen. –