PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [MySQL] Ein Artikel in mehreren Kategorien, nur wie?



MasterFX
02-06-2008, 17:02
Hallo zusammen.
Ich bin gerade dabei eine Komponentendatenbank zu programmieren. Es soll daher eine Sammlung von Elektronikkomponenten werden. Nun kann es hin und wieder vorkommen, dass eine Komponente in mehr als einer Kategorie vorkommt.
Beispiel:
Eine Compact-Flash Speicherkarte soll sowohl unter Massenspeicher als auch unter Flash-Speichermedien auftauchen. Obs in diesem Fall wirklich sinnvoll ist sei mal dahingestellt. Es geht mir halt darum die Datenbank von anfang an gleich so zu machen, dass ich für diesen Fall wieder alles umbauen muss.
Wie macht man das in so einem Fall?
Ich habe das früher mal so gemacht, dass ich ein Feld "Kategorie" hatte und jeder Kategorie eine Zahl zugewiesen habe (in einer separaten Tabelle). Bei dem Bei dem Artikel selbst habe ich dann in das Kategorie-Feld z.B. für Kategorie 4 und 12 einfach sowas eingetragen: "4,12". Also die Nummern einfach durch ein Komma getrennt. Bein suchen habe ich dann in diesem Feld geguckt ob dort eben z.B. die "12" drin vorkommt.
Bloß frage ich mich ob das so sinnvoll ist, denn so lässt sich die Kategorie nicht gleich bei der SQL-Abfrage richtig separieren, was imho bei sehr großen Datenbanken zu Geschwindigkeitseinbußen führen könnte.
Gibt es evtl. eine besser Lösung? Ein neues Feld für "Kategorie2","Kategorie3" etc. anzulegen erscheint mir nicht gerade günstig.

ContainerDriver
02-06-2008, 18:06
Hallo,

wenn du mehrere Informationen in einem Feld abspeicherst, dann ist die Tabelle nicht mehr normalisiert (Verletzung der 1NF), das hast du gut erkannt.
Entweder du hast eine Tabelle Produkt und eine Tabelle Kategorie, dann besteht zischen diesen eine n:m-Beziehung -> Abbildung in einer Verknüpfungstabelle, oder du hast noch keine extra Tabelle Kategorie, dann könntest du eine neue Tabelle Kategorie anlegen, in der nur die Verbindungen von Produkt zu Kategorie enthalten sind (bin mir aber bei der zweiten Lösung nicht ganz sicher), der Primärschlüssel in der neuen Tabelle setzt sich dann aus einer ID + dem Fremdschlüssel von Produkt zusammen, z.B.



Produkt:
1, Speicherkarte
2, Festplatte
3, Grafikkarte

Kategorie:
1, 1 (1 = Fremdschlüssel aus Produkt)
2, 1
2, 2
3, 3


Gruß, Florian

MasterFX
02-06-2008, 18:26
Danke schonmal für die Antwort.
Meinst du damit: Ich lege die Verbindung von Produkt und Kategorie in der Kategorie-Tabelle selbst ab!?
Würde das nicht die gesamte Tabelle total aufblähen? Denn wenn ich in der Kategorie-Tabelle einer Kategorie 400 Artikel zuordne und einer anderen nur 100, dann würden ja dennoch alle Felder auf 400 Stück erweitert, oder hab ich da was falsch verstanden

jan61
02-06-2008, 18:40
Moin,

nein, so ist das mit Sicherheit nicht gemeint, sondern so:


Produkt -> Produkt_Kategorie <- Kategorie
prod_id <-> FK <-> prod_id
kat_id <-> FK <-> kat_id
Die Primary Keys:
Produkt.prod_id
Kategorie.kat_id
Produkt_Kategorie.prod_id+kat_id

Jan

MasterFX
02-06-2008, 21:38
Also du meinst drei Tabellen (Produkte,Produkt_Kategorie und Kategorie).
In Produkte sind eben die Produkte mit eindeutiger ID (+Beschreibung und den anderen Kram). Dann eine Kategorie-Tabelle, wo jeder Kategorie eine ID und eine Bezeichnung zugewiesen wird.
Zu guter letzt eine Tabelle, die das Produkt mit einer oder mehreren Kategorien verknüpft. Soweit richtig?
Nur wie sieht die die Produkt_Kategorie-Tabelle aus, wenn ein Produkt mehreren Kategorien zugeordnet ist? Nach deiner Beschreibung habe ich ja je Zeile nur eine Kategorie, sprich bei zwei Kat's besitzt die Tabelle drei Spalten (je Kat. eine), oder was? Ich kann sie ja nicht in einem Feld zusammenfassen, da ich sie sonst nicht bei der SQL-Abfrage trennen könnte. Somit würde ja das Produkt, das den meisten Kategorien zugeordnet ist die Anzahl der Spalten vorgeben!?

ContainerDriver
02-06-2008, 22:02
Du darfst nicht in die Breite, sondern musst in die Länge denken.
In der Verknüpfungstabelle steht für jedes Produkt die Kategorie drinnen - hat ein Produkt mehrere Kategorien, dann kommt die Produkt-ID in mehreren Zeilen mit unterschiedlichen Kategorie-IDs vor.



Produkt:
ID | Produkt
---+---------------
1 | Festplatte
2 | USB-Stick
3 | CD-Rohling
4 | Tastatur
5 | MP3-Player

Kategorie:
ID | Name
---+----------------
1 | Massenspeicher
2 | Optische Medien
3 | Audiogeräte
4 | Hardware

Verknüpfung:
PID | KID
----+-----
1 | 1
1 | 4
2 | 1
2 | 4
3 | 2
4 | 4
5 | 1
5 | 3
5 | 4

MasterFX
02-06-2008, 23:28
Ahh, nun hab ichs geschnallt... hat aber auch gedauert :-D
Vielen Dank, dann werde ich mich mal ranmachen

jan61
02-06-2008, 23:29
Moin,


Du darfst nicht in die Breite, sondern musst in die Länge denken.

Sehr treffend auf den Punkt gebracht ;-)

Deshalb habe ich den Primary Key (also den eindeutigen Schlüssel) für Produkt_Kategorie auch mit den beiden Spalten prod_id und kat_id bezeichnet - jede beliebige (eindeutige) Kombination aus Produkt und Kategorie ist zulässig.

Jan

MasterFX
03-06-2008, 08:26
Ich glaube ich habe mich zu früh gefreut.
Mir fällt ja gerade ein, dass die Tabelle ggf. für jede Kategorie anders aufgebaut sein muss. Denn ich wollte es so machen, dass man die Produkte über Filter sortieren kann z.B. Massenspeicher sollen nach Kapazität, Schnittstelle etc. sortiert werden. Eine CPU besitzt diese eigenschaft natürlich nicht. Von daher müsste ich ja eigentlich für jede Kategorie eine eigene Tabelle machen, wo eben die speziellen Felder definiert sind...

Moment, oder macht man in diesem Fall ähnlich?
Ich mache eine Tabelle wo alle Produkte eingetragen sind (prod_id, bezeichnung...und alle Felder die überall gleich sind) und dann noch jeweils eine spezielle Tabelle für die nicht gleichen Felder einer Kategorie?

Oder würde man in diesem Fall eine Tabelle machen, wo die Felder alle als "TEXT" sind so dass diese über jegleiche Arten von Daten verwendet werden können?

Oder wie würde man hier vorgehen?

ContainerDriver
03-06-2008, 08:40
Wir hatten hier schon mal etwas ähnliches, vielleicht kannst du damit was anfangen: http://www.mrunix.de/forums/showthread.php?t=56569.

MasterFX
03-06-2008, 09:00
Mhh, ich sehe schon. Wenn man es richtig machen will, wird die ganze Sache ziemlich komplex.
Ich glaube ich werde es erstmal so lösen, dass ich es wirklich in mehreren Tabellen mache. Zumal es auch nicht zig tausen Artikel umfassen wird denke ich, dass es zu viel Aufwand wäre es perfekt zu machen.

Dennoch vielen Dank euch beiden für die hilfreiche Beteiligung, ich denke für mein nächstes größeres Projekt wird es mir mit Sicherheit weiterhelfen.