Laden...

DataSet normalisieren. Wie wird das gemacht?

Erstellt von BenFire vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.705 Views
B
BenFire Themenstarter:in
50 Beiträge seit 2006
vor 17 Jahren
DataSet normalisieren. Wie wird das gemacht?

Ich bins mal wieder...

und diesmal mit einer etwas längeren Frage zum Thema Normalisierung von Tabellen aus einem XML File...

Folgende Sachlage:
Ich habe 3 Tabellen


1. DeviceDataTable
DeviceID, SerialNumber , Date


2. SequenceTable
Value, TestNameFK, DeviceFK
..........1            1
..........2            1
..........3            1
..........n            1
..........1            2
..........2            2
(Zu einem Device gehören ca. 30 Test´s.)


4. TestNameTable
TestnameID, Test
1           Test 1
2           Test 2 
3           ........
4           Test n 


Ich les 2 Tabellen aus einem XML File aus....speichere diese danach auf einem DataSet (XMLDS).
Dieses DataSet hat dann also die 2 Tabellen (DeviceDataTable und SequenceTable).
In der SequenceTable stehen die Tests mit ihrem kompletten Testnamen.
Da dies aber aus Speichertechnischer Sicht nicht die optimalste Lösung ist, würde ich das ganze halt gerne normalisieren. Sprich eine weitere Tabelle auf dem DB-Server erstellen welche dann die (aktuellen [auch erweiterbar]) Testnamen und die zugehörige ID enhält.
Es lässt sich wohl anscheinend nicht vermeiden, dass ich bevor ich die Daten aus dem XMLDS normalisiert in die DB schreiben kann noch einmal die TestNameTable aus der DB in ein DataSet lade....mir dann nach und nach die Testname aus der SequenceTable im XMLDS geben lasse .... um nach diesen in der TestNameTable zu suchen und mir dann die jeweilige ID zurückgeben lasse....oder geht das auch anders???
Mein Bedenken ist halt, dass ich für jeden Testname dann erst immer in der TestNameTable suchen muss. Das ist bei einer Tabelle noch ok, aber wenn ich dann bei mehreren Werten (also nicht nur Testname sondern auch noch Result, Testtyp etc) immer erst noch in zig Tabellen suchen muss um mir eine ID zurückgeben zu lassen....frag ich mich halt, wie performant das ganze dann noch ist.
Vielleicht hab ich da auch grad eben irgendwie die falsche Idee und es geht auch einfacher........

gleich noch eine Frage in diesem Zusammenhang.
manipuliere ich dann das DataSet/die DataTable und führe erst zum Schluss per DataAdapter ein insert aus, oder schreibe ich jeden Test einzeln mit ExecuteNonQuery in die DB, sobal ich die (Test)Zeile zusammengebastelt habe.
Was ist denn da performanter?

Ich hoffe ihr könnt mir da ein paar Tips geben.
Vielen Dank.

ben

B
BenFire Themenstarter:in
50 Beiträge seit 2006
vor 17 Jahren

Ist euch noch irgendetwas unklar?
Wenn ja, dann sagts dann versuch ich die frage nochmal umzuformulieren.

Ben

J
3.331 Beiträge seit 2006
vor 17 Jahren

Hallo ben,

es liegt wohl weniger an Deiner Fragestellung als am Inhalt, dass Du keine Antworten bekommen hast. Als ich Dein Problem gestern las, kam ich auch ins Grübeln: Brauchst Du grundsätzliche Hilfe zur Normalisierung oder spezielle zu Deinen Tabellen? Und was willst Du mit diesen Tabellen erreichen?

Das wurde mir alles zu kompliziert und unverständlich; deshalb habe ich auf eine Antwort verzichtet. Vielleicht befasst Du Dich einmal mit grundlegenden Informationen; ich wurde über Google zu Deiner Frage Normalisierung von Tabellen direkt zu Wikipedia geführt.

Zu Deiner Zusatzfrage: Auch das hängt von der Situation ab. Schneller geht es in der Regel, am Ende alle Datensätze auf einen Schlag zu speichern:

DataAdapter1.Update(DataTable1);

Aber wenn Du einzelne Datensätze sofort übertragen willst oder wegen Referenzen die genaue Reihenfolge beachten musst, dann kannst Du auch einzelne Datensätze speichern.

Viel Erfolg! Jürgen

B
BenFire Themenstarter:in
50 Beiträge seit 2006
vor 17 Jahren

Ersteinmal vielen dank für deine Antwort.
also ich versuchs nochmal zu erleichtern.

Eigentlich will ich nur für einen String in einer Tabelle einen Indize einer anderen eintragen.

Tabelle
Ergebnis
TRUE
FALSE
TRUE
TRUE
etc.

und um jetzt die größe der Tabelle nicht exorbitant anschwellen zu lassen, will ich halt die strings in einer anderen Tabelle definieren und in der Ausgangstabelle nur noch die jeweilige ID eintragen.
ALSO:

Tabelle
ErgebnisID
1
0
1

Hilfstabelle
ID Ergebnis
0 FALSE
1 TRUE

Ich würde also auf dem SQL-Server diese zusätzliche Hilfstabelle noch mit anlegen.
Jetzt geht es aber darum, wie ich die zuordnung realisiere, damit die DataTable (Tabelle) aus dem DataSet im C# weiss welcher String welche ID besitzt.
Also müsste ich doch zusätzlich noch die Hilfstabelle auslesen und dann nach jedem String in dieser Tabelle suchen und mir die ID geben lassen.
Oder geht das auch noch anders???
Hoffe das beschreibt mein Problem jetzt etwas besser.
Vielen Dank für Eure Mühe

Ben

J
3.331 Beiträge seit 2006
vor 17 Jahren

Hallo Ben,

also für mich klingt das wie Referenz (ForeignKey). Diesen legst Du doch in der Datenbank an, oder? Das Dataset hat doch zunächst nichts mit der Speicherung der Daten zu tun, sondern nur mit der Anzeige. (Dass daraus auch Daten gespeichert werden können, ist erst die nächste Frage.)

Also hast Du zwei Möglichkeiten (vereinfacht dargestellt):

  1. Du holst die gewünschten Daten in der gewünschten Darstellung, also mit einem SELECT und JOIN, und speicherst sie in einer Tabelle.
  2. Du registrierst im Dataset eine entsprechende Referenz (das geht mit einem typisierten Dataset auch direkter) und holst die Daten getrennt in zwei Tabellen.

Ob auch das Abholen mit einem Select (wie bei 1) und Übertragen in zwei Tabellen (wie bei 2) möglich ist, habe ich noch nicht untersucht.

**Wenn sich die von Dir genannten Strings mehrfach wiederholen, dann gehören sie unbedingt und selbstverständlich in eine eigene Tabelle (mit Querverweis über die ID). Insofern ist die Frage zur Normalisierung eindeutig zu beantworten. **Deine Probleme reduzieren sich also auf praktische Fragen; diese solltest Du dann (nach neuen eigenen Versuchen) konkret neu formulieren.

Gruß Jürgen