Guten Tag,
folgende Ausgangssituation vorhanden:
Ich benutze MS SQL 2012 es geht mir hier aber um das generelle DB design!
Ich habe eine Menge von Objekten ( > 300.000 ) und wachsend. Dann hab ich eine Menge von ca 10.000 Variablen (Menge fest). Die Variablen sind im Bezug auf die Objekte Boolesche Werte, d.h. ein Object bestizt entweder die Variable (true) oder eben nicht. Im Schnitt sind pro Objekt ca 200 Variablen auf True, d.h. 9800 auf false.
Zur Zeit sieht meine Datenbank so aus:
Tabelle 1 (Objekte)
id int primary key, name string, string farbe, string länge
(Farbe könnte auch ein foreign key sein ich weiß)....
Beispiel:
Tabelle 1
1234, Kreis, Grün, 30 cm
1256, Viereck, schwarz, 5 cm
Tabelle 2 (Variablen)
id string, klartext string
Bsp:
Tabelle 2
AB1, skizze
C3F, rund
C3E, eckig
Tabelle 3 (Variablen pro Objekt)
idT1 int foreign key (auf Tab1 id) INDIZIERT , idT2 string foreign key (auf Tab2 id)
Bsp:
Tabelle 3
1234, AB1
1234, C3F
1256, AB1
Nun mein Problem:
Wenn ich Abfragen habe wie:
Select idT2 from Tabelle 3 where idT1 = 1234
und danach
Select idT2 from Tabelle 3 where idT1 = 1256
dauert dies ca 0,006 Sekunden / Abfrage. Ich muss aber in einem Schwung meist alle 300.000 Objekte Abfragen. Dies dauert dann also 30 Minuten.
Meine Idee war nun
Tabelle 3 löschen und in Tabelle 1 eine weiter Spalte
Tabelle 1 (neu)
id int primary key, name string, string farbe, string länge, string weitere Attribute
Beispiel:
1234, Kreis, Grün, 30 cm, {AB1;C3F;....}
Die Abfrage geht so weit auch sehr flott, Problem ist nun habe ich keine Normalenform mehr und wie löse ich:
Select id from Tabelle 1 where Attribut AB1 = true
??? Soll ich ein Mix aus beiden sachen machen? Dann speicher ich allerdings alles redundant ab. Kennt jemand ein best practice?
MfG
folgende Ausgangssituation vorhanden:
Ich benutze MS SQL 2012 es geht mir hier aber um das generelle DB design!
Ich habe eine Menge von Objekten ( > 300.000 ) und wachsend. Dann hab ich eine Menge von ca 10.000 Variablen (Menge fest). Die Variablen sind im Bezug auf die Objekte Boolesche Werte, d.h. ein Object bestizt entweder die Variable (true) oder eben nicht. Im Schnitt sind pro Objekt ca 200 Variablen auf True, d.h. 9800 auf false.
Zur Zeit sieht meine Datenbank so aus:
Tabelle 1 (Objekte)
id int primary key, name string, string farbe, string länge
(Farbe könnte auch ein foreign key sein ich weiß)....
Beispiel:
Tabelle 1
1234, Kreis, Grün, 30 cm
1256, Viereck, schwarz, 5 cm
Tabelle 2 (Variablen)
id string, klartext string
Bsp:
Tabelle 2
AB1, skizze
C3F, rund
C3E, eckig
Tabelle 3 (Variablen pro Objekt)
idT1 int foreign key (auf Tab1 id) INDIZIERT , idT2 string foreign key (auf Tab2 id)
Bsp:
Tabelle 3
1234, AB1
1234, C3F
1256, AB1
Nun mein Problem:
Wenn ich Abfragen habe wie:
Select idT2 from Tabelle 3 where idT1 = 1234
und danach
Select idT2 from Tabelle 3 where idT1 = 1256
dauert dies ca 0,006 Sekunden / Abfrage. Ich muss aber in einem Schwung meist alle 300.000 Objekte Abfragen. Dies dauert dann also 30 Minuten.
Meine Idee war nun
Tabelle 3 löschen und in Tabelle 1 eine weiter Spalte
Tabelle 1 (neu)
id int primary key, name string, string farbe, string länge, string weitere Attribute
Beispiel:
1234, Kreis, Grün, 30 cm, {AB1;C3F;....}
Die Abfrage geht so weit auch sehr flott, Problem ist nun habe ich keine Normalenform mehr und wie löse ich:
Select id from Tabelle 1 where Attribut AB1 = true
??? Soll ich ein Mix aus beiden sachen machen? Dann speicher ich allerdings alles redundant ab. Kennt jemand ein best practice?
MfG