Laden...

DB Strukturierungsfrage: Items mit variablen Feldern

Erstellt von temilun vor 12 Jahren Letzter Beitrag vor 12 Jahren 738 Views
T
temilun Themenstarter:in
6 Beiträge seit 2011
vor 12 Jahren
DB Strukturierungsfrage: Items mit variablen Feldern

verwendetes Datenbanksystem: Firebird

Hallo,

Ich bin grad etwas unsicher, wie ich meine DB strukturieren soll. Ich möchte Artikel speichern, die allerdings völlig unterschiedliche "Eigenschaften" haben können, z.B.:

Mainboard: Hersteller, Prozessorsockel, Onboard-Grafik, usw.
Festplatte: Hersteller, Bus, Kapazität
USB-Leitung: Länge

Ich kann ja jetzt schlecht für alle möglichen Eigenschaften ein Feld anlegen, von denen dann die meisten leer sind.

Eine Möglichkeit wäre es, die Artikel mit ihren Grunddaten in einer Tabelle zu halten und daneben eine weitere Tabelle mit den Eigenschaften zu den Artikeln, a la:

Artikel
Id
KategorieId
Hersteller

ArtikelEigenschaft
ArtikelId
Typ(Id)
Value

Da ich natürlich nicht jeden x-beliebigen Datentypen freigeben will, würde das dazu führen, dass ich noch eine Tabelle "ArtikelTypen" anlegen muss, die die verfügbaren Typen enthält und eine Tabelle "ArtikelKategorie", die die Information enthält, welche Eigenschaften für welche Kategorie verfügbar sind. Das wird ja recht aufwändig.

edit:

Eine andere Möglichkeit wäre in der Artikeltabelle in einem varchar-Feld die Eigenschaften z.B. als CSV zu speichern. Damit ist dann allerdings die Suche über Eigenschaften nicht mehr ganz angenehm.

Gibt es noch eine bessere Lösung dafür? Das Problem kann ja nicht ganz neu sein, siehe einen der vielen Online-Shops mit entsprechender Artikel-DB.

Ich denke sogar drüber nach auf eine Dokumenten-DB (z.B. RavenDB) setzen, da bin ich flexibel.

Gruß,
Temilun

D
6 Beiträge seit 2010
vor 12 Jahren

Hallo Temilun,

ich denke, du hast da schon den richtigen Ansatz. Damit ist deine Datenstruktur leicht erweiterbar und gut pflegbar. Der csv-Ansatz würde dir in meinen Augen langfristig mehr Probleme bereiten. Wie du selber schon schreibst wird die Suche ziemlich unschön und vor allem langsam. Häufig wirst du die Daten erst auslesen und dann durchsuchen müssen um sinnvolle Ergebnisse zu bekommen.
Klar, du hast initial einen ziemlichen Aufwand um überhaupt die Datenbasis hinzubekommen, aber ich denke, dass du mit dem normalisierten Vorgehen dennoch besser fährst.

Darksaber

1.564 Beiträge seit 2007
vor 12 Jahren

Hallo temilun

Schließe mich Darksaber an. Was du da vor hast nennt sich "EAV/CR" Design und bietet sich gerade für solche Anforderungen an. Um solche Datenbanken abzufragen muss man an manchen Stellen etwas andere Wege gehen als bei einer normalen, relationalen Datenbank, aber man gewöhnt sich dran.

Wenn deine Artikel-Tabelle nicht zu viele Werte halten soll und Performance nicht zu kritisch sind könntest du auch eine XML Spalte nehmen. Ich weiß aber nicht ob Firebird so was bietet. Den CSV Weg solltest du schnell vergessen, da tust du dir keinen Gefallen.

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

T
temilun Themenstarter:in
6 Beiträge seit 2011
vor 12 Jahren

Danke für die Antworten. Ich hatte gehofft, dass es eine total simple Lösung gibt, die mir nur noch nicht eingefallen ist. Jetzt werde ich mich halt mal dran machen, meine Struktur aufzubauen und schau mal wie ich damit weiter kommen. "EAV/CR" hilft schon mal als Begriff, um noch mal etwas zu googlen.

Gruß,
Temilun