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
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
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ß.
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