Sven Rautenberg: MySQL

Beitrag lesen

Moin!

Milch:
  Fettgehalt
  Erzeugerangaben (Freitext)

Schraube:
  DIN
  Länge
  Gewinde
  Farbe

Die Kenngrößen für Schrauben werden daher in einer Tabelle für Schrauben udn die für Autos eben in einer für Autos geführt. Die Satzformate sind ja vollkommen unterscheidlich.

Mit anderen Worten: Du hast derzeit eine Tabelle mit den Artikeln, und je Artikelgruppe (Schrauben, Milch, Kekse, Autos) dann eine Tabelle, in der einzelne Spalten enthalten sind, welche die angebbaren Eigenschaften des Artikels beschreiben.

Ungünstiges DB-Design, würde ich mal sagen. Jedenfalls vom Standpunkt der Normalisierung aus gesehen.

Zunächst mal die Frage: Warum brauchst du für die einzelnen Artikel derartig unterschiedliche Eigenschaften? Ließen sich die Eigenschaften nicht in ein gemeinsames Schema pressen, welches dann für alle Artikel paßt? Im Zweifelsfall kommen also Gewicht/Volumen, Farbe, Abmessungen und Hersteller in eine Tabelle, und Zusatzangaben in ein Textfeld.

Oder du legst insgesamt drei Tabellen an, die flexibel zusammengesetzt werden:
1. Der Artikel an sich (mit einer Artikel-ID).
2. Eine Tabelle mit Eigenschaften und Eigenschafts-ID: Menge, Farbe, Gewinde, Fettgehalt, ...
3. Eine Tabelle, die aus drei Spalten besteht: Artikel-ID, Eigenschafts-ID, und Wert.

Damit kannst du dann alle Eigenschaften aller Artikel in genau einer Tabelle verwalten. Die Suche nach Eigenschaften gestaltet sich dann auch recht einfach. Wenn du beispielsweise alle Artikel mit Gewindemaß suchst, findest du die Eigenschafts-ID durch Benutzerangabe heraus, suchst dann alle Artikel-IDs in der Wertetabelle und verknüpfst dann die Artikel-Tabelle damit - und ggf. dann nochmal die Wertetabelle, um alle Angaben zum Artikel zu erhalten.

Die Pflege solche einer Tabelle ist wahrscheinlich etwas aufwendiger, aber auch wesentlich dynamischer. Denn wenn du neue Eigenschaften für bislang unbekannte Artikel hinzufügen willst, kommen die einfach in die Eigenschaftstabelle hinein und können dann sofort einem Artikel zugeordnet werden.

Und du kannst, um die Eigenschaften je nach Warengruppe einzuschränken, bzw. zuzuordnen, dann noch eine vierte Tabelle eröffnen, die Einträge hat in der Form "Warengruppe-ID <-> Eigenschafts-ID", damit gewisse Eigenschaften bei einer Warengruppe auftauchen, und der ganze Rest nicht (beispielsweise ist das verwendete Getriebeöl bei Food-Produkten eher uninteressant).

Wie kann ich jetzt ein SELECT aufbauen, das für jeden Datensatz die passenden Kenngrößen einschließt? Die zugehörige Tabelle erhalte ich ja erst aus dem Datensatz selbst.

Kann man solche Abfragen überhaupt in einer Anweisung aufbauen?

Schwierig. Deine einzige Chance wäre, dass du immer _alle_ Tabellen joinst. Das würde aber ziemlich aufwendig werden, was die Datenbankarbeit angeht. Und es würde dir ein heftig langes Ergebnis liefern, denn die entstehende Tabelle würde alle möglichen vorhandenen Eigenschaften auflisten, die meisten davon NULL.

Wie könnte ich ggf. die Datenstruktur ändern, um das in einer Abfrage hinzubekommen?

Mit der Aufsplittung wie oben beschrieben hast du mit Sicherheit mehr Erfolg. Allerdings gebe ich darauf keine Garantie, ich bin kein gelernter Datenbankmensch. Vielleicht gibts noch eine zweite Meinung in diesem Forum.

- Sven Rautenberg

--
"Beim Stuff für's Web gibts kein Material, was sonst das Zeugs ist, aus dem die Sachen sind."
(fastix®, 13. Oktober 2003, 02:26 Uhr -> </archiv/2003/10/60137/#m338340>)