Hallo,
Ich hab eine Frage wie ich 2 MySQL Tabellen am besten miteinander verknüpfen soll.
Die Produkte sollen beim Eintragen verschiedenen Märkten zugeordnet werden.
Z.B. "Quark" mit ID 1 aus der Tabelle B gibt es im "Tante Emma Laden" mit der ID 6 und bei "Steffens Eck" mit der ID 7 aus der Tabelle A.
ein Produkt kann es bei mehreren Märkten geben,
ein Markt kann mehrere Produkte führen,
=> das ist eine n:m-Beziehung, die Du in MySQL mit einer Beziehungstabelle
umsetzen solltest.
Wenn ein Markt aus Tabelle A gelöscht wird, soll auch dessen Zuordnung bei den Produkten entfernt werden.
So etwas löst man in Datenbankmanagementsystemen mit Foreign-Key-Constraints und ON DELETE CASCADE. MySQL kann das, aber nicht mit jeder Tabellenengine. MySQL unterstützt dies bei der InnoDB-Engine.
Meine Frage ist, wie ich die Zuordnung am besten speichern soll?
Sollte ich in der Produktetabelle eine Spalte anlegen in der sämtliche verfügbaren Märkte kommasepariert gelistet sind?
nein, so etwas ist eine fürchterlich schlechte Idee. Das ist ein Verstoß gegen die erste Normalform, der Dir - wie Du richtig erkennst -
Das dürfte mir Probleme machen wenn ich einen Markt lösche und dann jedes Produkt nach dessen Zuordnung durchsuchen muss um diese ebenfalls zu ändern.
stets Probleme bereiten wird.
Daher habe ich überlegt eine dritte Tabelle anzulegen in der die Zuordnung geregelt wird.
Nur wie muss die Struktur der Tabelle aussehen?
Da die Anzahl der Märkte und Produkte varriert, kann ich beides nicht als Spalte nehmen.
Meine Idee ist jetzt eine Tabelle C mit 2 Spalten.
Eine Spalte mit der ID vom Markt oder des Produkts und eine Spalte wieder mit einer kommaseparierten Liste des Gegenstücks.
Nein, vergiß kommaseparierte Adressen. Einfach eine Spalte mit der ID des Marktes und eine Spalte mit der ID des Produktes. Gegebenenfalls weitere Spalten mit Informationen zur Zuordnung: zum Beispiel die verfügbare Anzahl eines Produktes in einem bestimmten Markt, den Standardpreis des Artikels in diesem Markt - der Preis wird ja nicht überall der gleiche sein, ...
Komplizierter wird es dann noch, wenn ich einen Markt lösche, ein Produkt dadurch ohne Zuordnung dasteht und dashalb ebenfalls gelöscht werden muss.
Nein, ein Produkt wird nicht durch die Schließung von Märkten vom Markt genommen. Es wird deswegen vom Markt genommen, weil es nicht mehr hergestellt wird.
Wie löst man sowas also in der Praxis am besten?
mit einer Zuordnungstabelle. Mit der InnoDB-Engine. Mit Foreign-Key-Constraints, mit ON DELETE CASCADE.
Freundliche Grüße
Vinzenz