SQL Datenbank richtig normalisieren (Für Datenbank Experten)?

 - (Computer, Datenbank, sql)

3 Antworten

Die Darstellung, die Du da geschickt hast, kann nicht die reale Konfiguration der Tabellen zeigen, bzw. zeigt sie nicht vollständig:

Jede Tabelle muss in SQL einen eindeutigen Primärschlüssel haben. Der ist hier nicht zu erkennen. Der sollte am besten eindeutig benannt sein, damit es keine Missverständnisse gibt (also nicht einfach "ID"). Dazu gibt es keine Darstellung der Beziehung zwischen den Tabellen (1:n/n:1) und der Überschneidungsart (inner join/outer join).

Leider kenne ich mich nur mit der Darstellung bei der Microsoft-Lösung aus, da ich damit arbeiten muss.^^

Zum Verknüpfen einzelner Tabellen ist es notwendig, dort einen eindeutigen Bezug herzustellen. Dass ein Primärschlüssel als Identifier dort nochmal auftaucht, ist also normal.

Was irritierend ist, dass z.B. die Charge und Zeit in mehreren Tabellen auftaucht. Eventuell fehlen in der Struktur Zwischentabellen, die eine m:n-Beziehung ermöglichen.

Die Normalisierung für Dich zu übernehmen, ist allerdings nicht möglich, weil man da eine komplette Übersicht inklusive Beziehungen benötigt und zudem ein Verständnis der möglichen Konstellationen.

Woher ich das weiß: Berufserfahrung

Ich habe den Primärschlüssel aus der Anlagentabelle als Fremdschlüssel für die anderen 3 Tabellen genommen, da ich bei diesen eigentlich keinen Primärschlüssel bräuchte. Die 3 Tabellen sind nur mit der Anlagentabelle verknüpft.
Charge, Zeit und Länge treten mehrmals auf, weil ich zu unterschiedlichen Zeiten in die Tabellen schreibe. So wird für jede Charge nur einmal ein Eintrag in der Sollwerte Tabelle erstellt.

Bei der Istdaten Tabelle alle 3 Sekunden und bei der Fehler Tabelle nur, wenn wirklich ein Fehler auftritt. Hier können auch mehrere Fehler gleichzeitig in die Tabelle geschrieben werden.

Ich hoffe du kannst das nachvollziehen. Ich will ja z.B wissen welche Sollwerte ich bei welcher Charge habe ebenso wie ich wissen will welche Istdaten ich bei welcher Charge habe. Und bei welcher Charge der Fehler aufgetreten ist.

0

Vielleicht ist es nicht schön, aber ich sehe 1:1 und 1:n-Beziehungen zwischen den Tabellen.

Eine Charge kann mehreren Maschinen zugeordnet werden und eine Maschine mehreren Chargen und das eindeutig.

Warum die Zeit hier mehrfach erfasst wird, kann ich nicht sagen. Ich nehme an, dass hier die Möglichkeit abgefangen werden sollte, dass Verzögerungen auch zu unterschiedlichen Zeiten führen können.

Den Primärschlüssel der Tabelle "Maschinen" als Primärschlüssel für die anderen Tabellen zu verwenden, halte ich nicht für gut aufgrund der Wiederholungen. Als Fremdschlüssel wäre es meiner Ansicht nach möglich, wenn zugleich ein eigener Primärschlüssel pro Tabelle gesetzt ist.

Die Zeit und die Länge wird mehrfach erfasst, weil in die Tabelle "Fehler" nur reingeschrieben wird, wenn ein Fehler aufgetreten ist. Da will ich dann natürlich auch die Zeit wissen.

In der Tabelle Istdaten wird auch die Zeit erfasst, um später anfragen stellen zu können wie z.B gib mir die Prozesdaten zwischen t1 und t2.

Eine Charge gehört immer nur zu einer Maschine. Aber eine Maschine kann jedoch mehrere Chargen haben.
In der Tabelle Solldaten handelt es sich um zwei verschiedene Maschinen, welche zufällig die gleiche Chargen Nr. haben.

Welche Normalisierungsstufe ist mit diesem Design erreicht? Irgendwie eine Mischung aus 2 und 3, oder?

Danke schonmal für deine Antwort.

1

Ich würde eine Tabelle für die Chargen machen

Id / MaschinenId / ChargenId / Solldaten

Dann aus Istdaten und Fehlerdaten auf diese Id verlinken

Das wäre dann normalisiert, denn es gibt Maschine 1:n Chargen

Für jede Charge 1 : 1 Sollzustand, kann also in der Chargentabelle mit rein, muss aber nicht

Für jede Charge 1 : n Istzustände

Für jede Charge 1 : n Fehlerzustände

Danke schon mal! Sieht nun deutlich schlüssiger aus:
Denke so war es gemeint:
https://s16.directupload.net/images/190307/bp4mndcf.png

0
@dbnoob

Ja sieht besser aus

  1. Die Chargen müssten eigentlich noch in eine eigene Tabelle
  2. Du musst dir über Keys / Indizes Gedanken machen, da Abfragen auf deiner Ist-/Fehlerdatentabelle sonst sehr lange (mehrere Minuten) dauern können wenn diese Tabellen groß werden. Da musst du schauen was für Abfragen du planst und das dann berücksichtigen

Normalisierungsstufen sind auch schön und gut, aber ich würde vor allem die Performance und Datenintegrität berücksichtigen

1
@buffalo23

Müsste ich echt noch eine Tabelle "Chargen" machen?
Eigentlich sind die Solldaten (Zugkraft, Durchmesser, Spannung) ja durch ID_Charge + ID_Maschine + Chargen Nr. eindeutig identifizierbar. Somit treten ja keine Redundanzen auf.

Die Chargen Nr kann zwar bei verschiedenen Maschinen IDS gleich sein, aber das wäre ja so gesehen keine Redundanz, oder?

Aber schon mal vielen vielen Dank, so wie es jetzt ist, ist es schon mal deutlich besser.

0
@dbnoob

Ja, denn eine Charge ist eine Entität die es nur einmal gibt, deshalb sollte diese eine eigene Tabelle haben (prinzipiell), dann könnte man künftig zB Chargennamen etc erweitern

Und denk unbedingt nach über die Art der Abfragen auf den Tabellen und welche Keys/ Indizes du dafür anlegen musst sonst blockiert diese Datenbank weil es so extrem ineffizient ist

1

Datenbank: Unterschied/Definition von Schlüsselkandidat und Schlüssel?

Hallo ich beschäftige mich mit (speziell) relationalen Datenbanken und bin beim Thema Schlüssel angekommen. Ich kenne den Unterschied zwischen Fremdschlüssel und Primärschlüssel, bloß verstehe ich noch nicht was der Unterschied zwischen Schlüsselkandidat und Schlüssel ist. Im Internet habe ich eig. jede Seite gegooglet und nachgeschaut, aber verstehen tu ich es trotzdem nicht. Fremdschlüssel: Hat die gleichen Eigenschaften wie ein Primärschlüssel Ist ein Primärschlüssel, der auf einen Primärschlüssel in einer anderen Tabelle hinweist Damit der Fremdschlüssel auf den Primärschlüsel hinweisen kann ,müssen die Werte des Fremschlüssels mit dem des Primärschlüssel übereinstimmen

Primärschlüssel: Eindeutiger Bezeichner einer Tupel Werden meist unterstrichen Ist ein auserwählter Schlüsselkandidat Dient also zur Identifikation Besteht aus einem oder mehreren Attributen Das habe ich verstanden. Bloß was ist der Unterschied zwischen Schlüsselkandidat und Schlüssel. Ein Schlüsselkandidat besteht aus einem oder mehreren Attributen und hat die Möglichkeit/Chance ein Primärschlüssel zu werden. So also kann ein Schlüssel nur aus einem Attribut bestehen oder wie ist das? Wenn ja dann wären wiederrum einige Schlüsselkandidaten auch Schlüssel, weil sie aus einem Attribut bestehen? Oder ist ein Schlüssel eine allgemeine Bezeichnung für alle anderen Schlüsselarten? Was ist denn der genaue Unterschied? Schlüssel können einen Tupel eindeutig identifizieren, aber Schlüsselkandidat doch auch?

...zur Frage

Wie kann man eine ganze Datenbank nach Nach einem Wert durchsuchen?

Guten Abend alle miteinander,

ich habe folgendes Problem, und zwar habe ich eine MySQL Datenbank mit mehreren Tabellen (z.B. Tabelle "users", "Name1", "Name2"). In der "users" Tabelle ist der Benutzer gespeichert mit allen Daten + einen Code. Ein Benutzer kann sich mit dem "Code" eine Zeit aussuchen und in die anderen Tabellen eintragen also in "Name1", "Name2" usw. Damit er sehen kann, in welchen Tabellen er mit welcher Zeiten alles drinne steht, soll es ein Formular geben, indem er seinen Code eingibt und dann die Tabellen mit dem Wert Zeit angegeben werden soll. Wie kann ich das machen.

Ich hoffe, dass es irgendwie gut erklärt ist. Ich habe versucht es einfacher zu erklären als ich es wirklich habe also bitte nicht vom Sinn her wundern.

Vielen Dank erstmal für eure Hilfe im Vorraus

...zur Frage

C# localeDB erstellen + Tabelle hinzufügen?

Hey, Ich möchte gerne ein Programm schreiben das im Programm selber (also es legt keine Dateien auf dem Rechner an! Den das Programm soll die Daten an einem Anderen PC wieder lesen & damit arbeiten können!!!) eine DatenBank hat (SQL). (Hab das hier dann gefunden: https://msdn.microsoft.com/de-de/library/ms233763(v=vs.110).aspx#BKMK_CreateNewSQLDB) Allerdings hatte ich dann Probleme eine Tabelle hinzuzufügen! Und als ich dann das geschaft hatte und die Tabelle speichern wollte, wollte Visual Studio das ich die *.sql Datei auf meinem Localen Rechner speichere!

Nun zu meiner Frage:

Wie mache ich das dass ich eine localeDB im Programm erstelle, sodas dass Programm wenn es ausgeführt wird keine daten auf dem Rechner speichert!!! Sondern "im" Programm selber! In der DB muss ich dann Tabellen anlegen die ich später dann auslesen soll!

Info: Ich darf nicht die Daten auf einem SQL Server (der im Internet liegt) speichern! Da es sich um wichtige Daten bez. Informationen handelt die nicht im Internet sein dürfen!!

MfG Emanuel :D

...zur Frage

Was möchtest Du wissen?