Verknüpfungstabelle wird riesengross
Henk
- datenbank
0 dedlfix0 Henk0 Vinzenz Mai0 Henk
0 Vinzenz Mai0 Henk0 Vinzenz Mai0 Henk
Moin moin!
Vielleicht stehe ich gerade einfach etwas auf dem Schlauch, jedenfalls habe ich folgendes Problem (MySQL 5):
ich habe 3 Tabellen, die jeweils u.a. eine id-spalte (PRIMARY, auto_increment) haben.
Nennen wir sie mal
produkte (200000 Zeilen)
laender (200 Zeilen)
distributionskanal (200 Zeilen)
Ich möchte jetzt diese Tabellen verknüpfen und dabei den möglichen Kombinationen einen Wert aus einer ENUM-Spalte 'rechte' zuweisen, diese Verknüpfungstabelle könnte also so aussehen:
id_produkt INT
id_land INT
id_distributionskanal INT
rechte ENUM('exklusiv','nicht-exklusiv','keine')
Soweit, so gut. Wenn ich mir jetzt aber überlege, das bei Verknüpfung aller Datensätze die Verknüpfungstabelle auf 200000*200*200 = 8.000.000.000 (in Worten: acht Milliarden) Datensätze anwächst, wird mir etwas weich in den Knien.
Wie löst man so etwas am besten?
Viele Grüße,
Henk
Hi!
Wenn ich mir jetzt aber überlege, das bei Verknüpfung aller Datensätze die Verknüpfungstabelle auf 200000*200*200 = 8.000.000.000 (in Worten: acht Milliarden) Datensätze anwächst, wird mir etwas weich in den Knien.
Wie löst man so etwas am besten?
Indem du nicht alle drei Rechte sondern nur zwei Rechte festhältst und den mit den meisten Vorkommen weglässt. "Kein Datensatz" bedeutet dann dieser Wert.
Lo!
Hi!
Indem du nicht alle drei Rechte sondern nur zwei Rechte festhältst und den mit den meisten Vorkommen weglässt. "Kein Datensatz" bedeutet dann dieser Wert.
Ok, aber auch damit werde ich nicht wirklich glücklich, da hier für sehr viele der produkte für alle Länder rechte existieren. Es werden also sicher nicht 8 Milliarden Datensätze aber vielleicht 2 Miliarden. Fühlt sich auch nicht viel besser an.
Gibt es für solche Dinge einen anderen Ansatz als Verknüpfungstabellen?
Viele Grüße,
Henk
Hallo,
Ok, aber auch damit werde ich nicht wirklich glücklich, da hier für sehr viele der produkte für alle Länder rechte existieren. Es werden also sicher nicht 8 Milliarden Datensätze aber vielleicht 2 Miliarden. Fühlt sich auch nicht viel besser an.
Gibt es für solche Dinge einen anderen Ansatz als Verknüpfungstabellen?
wenn die Rechte so spezifisch vergeben werden? Nein.
Werden die Rechte so spezifisch vergeben?
Freundliche Grüße
Vinzenz
Hi,
Danke soweit!
Werden die Rechte so spezifisch vergeben?
Unterschiedlich. Teils gelten für ein produkt die gleichen rechte für alle laender, teils sind diese abhängih von land und/oder distributionskanal.
In den wenigsten Fällen wir des wirklich so spezifisch, aber die Möglichkeit muss ich vorsehen...
Gruß,
Henk
Hallo,
Ich möchte jetzt diese Tabellen verknüpfen und dabei den möglichen Kombinationen einen Wert aus einer ENUM-Spalte 'rechte' zuweisen, diese Verknüpfungstabelle könnte also so aussehen:
id_produkt INT
id_land INT
id_distributionskanal INT
rechte ENUM('exklusiv','nicht-exklusiv','keine')Soweit, so gut. Wenn ich mir jetzt aber überlege, das bei Verknüpfung aller Datensätze die Verknüpfungstabelle auf 200000*200*200 = 8.000.000.000 (in Worten: acht Milliarden) Datensätze anwächst, wird mir etwas weich in den Knien.
Wie löst man so etwas am besten?
Typischerweise gibt es auch nicht jedes Produkt in jedem Land und dazu noch jede Kombination über jeden Distributionskanal. Nicht existente Kombinationen werden nicht eingetragen. Ist der Attributwert 'keine' erforderlich? Wenn nein, weglassen.
Das ist übrigens typisch für solche Verknüpfungstabellen und nicht spezifisch für Dein Beispielszenario. Nur relevante Kombinationen werden in die Verknüpfungstabelle eingetragen.
Freundliche Grüße
Vinzenz
Hallo,
Nicht existente Kombinationen werden nicht eingetragen.
Leider werden ziemlich viele Kombinationen übrigbleiben, sagen wir mal 1 Milliarde...
Das ist übrigens typisch für solche Verknüpfungstabellen und nicht spezifisch für Dein Beispielszenario. Nur relevante Kombinationen werden in die Verknüpfungstabelle eingetragen.
Ok, und ist eine Verknüpfungstabelle mit einer Anzahl Datensätzen im Milliardenbereich für ein DBMS auf Standardhardware mit wenigen Prozessoren, wenigen GB Speicher und keinem Riesen-RAID-Gedöns überhaupt irgendwie händelbar?
Das kann ich mir fast nicht vorstellen :-(
Gruß,
Henk
Hallo,
Leider werden ziemlich viele Kombinationen übrigbleiben, sagen wir mal 1 Milliarde...
Ok, und ist eine Verknüpfungstabelle mit einer Anzahl Datensätzen im Milliardenbereich für ein DBMS auf Standardhardware mit wenigen Prozessoren, wenigen GB Speicher und keinem Riesen-RAID-Gedöns überhaupt irgendwie händelbar?
Die Verknüpfungstabelle umfasst selbst in diesem Fall "nur" ein paar (ungefähr 10) Gigabyte. Warum sollte dies ein Problem darstellen?
Du wirst im Allgemeinen nur mit überschaubaren Ausschnitten arbeiten. Und damit können DBMS in aller Regel gut umgehen.
Ob das Rechtesystem sinnvoll ist, wage ich zu bezweifeln. Du wirst keine Milliarde Rechte einzeln vergeben. Werden Rechte jedoch auf ganze "Bereiche" vergeben, so solltest Du dies ganz genauso darstellen. Das Einzelrecht könnte man über eine UNION ermitteln.
Verschaffe Dir deswegen zuerst eine Übersicht, *wie* die Rechte vergeben werden.
Vermutlich wird es eine gute Idee sein, diesen Prozess abzubilden. Ich bin mir sicher, die Einzelberechtigung auf eine bestimmte Kombination wird ein Einzelfall sein :-)
Freundliche Grüße
Vinzenz
Hi,
Warum sollte dies ein Problem darstellen?
klingt halt echt groß ;-)
Vermutlich wird es eine gute Idee sein, diesen Prozess abzubilden.
Ok, meistens werden Rechte global oder für eine bestimmte Region z.B. Latein-Amerika vergeben. Diese Struktur Global->Regionen->Länder könnte man also als Baumstruktur sehen, das würde zumindest die Verknüpfungstabelle verkleinern, bestimmte Abfragen bzgl. laender, die dann rekursiv sein müssten, aber wohl stark verlangsamen. Ob und wie häufig solche Abfragen nötig wären, werde ich mir mal ansehen.
Ausnahmen könnte man woanders definieren. Man könnte also für ein produkt global exklusive rechte haben, aber für einen bestimmten distributionskanal nicht-exklusive und ein bestimmtes land gar keine. Dies entspräche in etwa dem wirklichen Leben.
Dann müsste man noch eine Priorität der Rechte festlegen. Schön ist das alles auch nicht :-(
Viele Grüße und Danke!
Henk
Hallo,
Vermutlich wird es eine gute Idee sein, diesen Prozess abzubilden.
Ok, meistens werden Rechte global oder für eine bestimmte Region z.B. Latein-Amerika vergeben. Diese Struktur Global->Regionen->Länder könnte man also als Baumstruktur sehen, das würde zumindest die Verknüpfungstabelle verkleinern, bestimmte Abfragen bzgl. laender, die dann rekursiv sein müssten, aber wohl stark verlangsamen.
Nein, nicht rekursiv. Ein Join oder ein Subselect.
Ob und wie häufig solche Abfragen nötig wären, werde ich mir mal ansehen.
vor allem kann man diese Abfragen optimieren.
Ausnahmen könnte man woanders definieren. Man könnte also für ein produkt global exklusive rechte haben, aber für einen bestimmten distributionskanal nicht-exklusive und ein bestimmtes land gar keine. Dies entspräche in etwa dem wirklichen Leben.
Wenn es so ist, bilde es so ab.
Dann müsste man noch eine Priorität der Rechte festlegen.
das musst Du sowieso tun. Auch bei der von Dir zuerst angedachten Lösung.
Schön ist das alles auch nicht :-(
viel schöner als das Handling von 8 Milliarden Einzelrechten und gegebenenfalls dem Updaten von Millionen Datensätzen statt eines einzigen (Recht auf eine Region und alle Distributionskanäle).
Freundliche Grüße
Vinzenz