Datenstruktur-Problem MySQL

Hallo Experten,
da ich bald am verzweifeln bin, wende ich mich mit dieser Denksportaufgabe an Euch:
In der Datenbank gibt eine Tabelle „Land_von“, in der alle Länder der Welt stehen, jedem ist ein Bereich „Zone“ von 1 - 8 zugeordnet. In der zweiten Tabelle „Land_in“ stehen ebenfalls die Länder, hier ist jedem Land ein Bereich „Welt“ von 1 - 20 zugeordnet.
Die Abfrage der Datenbank klappt insoweit prima, wenn der Bereich „Welt“ gleich bleibt, dh. das Land in der Tabelle „Land_in“ hat z.B. den Bereich „W4“, egal ob das Land der Tabelle „Land_von“ der Zone 1 („Z1“), der Zone 2 („Z2“) usw. zugeordnet ist. Zur Verdeutlichung: (Land a,b,c,d,)|Z1 -> (Land x)|W4; (Land e,f,g,h)|Z2 ->(Land x)|W4;…Jetzt das eigentliche Problem: Die Zuordnung des Bereiches „Welt“ ändert bei dem Land der Tabelle „Land_in“, je nach der Zoneneinteilung des Landes der Tabelle"Land_von": (Land a,b,c,d)|Z1 -> (Land x)|W4; (Land e,f,g,h)|Z2 -> (Land x)|W5 !
Mir ist als einzige Lösung eingefallen, über eine dritte Tabelle die „Weltbereiche“ der einzelnen Länder den „Zonenbereichen“ der Ursprungsländer zuzuordnen, das bedeutet aber das ich jeden Datensatz achtmal (Zonen 1 -8) aufführen muß. -> Datenrenundanz!!
Fällt jemandem eine andere Lösung ein?
Ich bedanke mich schon im voraus.
Schöne Grüße
Ralf Karnowsky

Hallo Ralf,

sorry, hab normalerweise echt Freude an Denksportaufgaben, aber kannst Du Deine noch mal anders formulieren. Ich meine:

a) keine Worte weglassen
b) öfter mal Return drücken, um den Text zu gliedern
c) die Aufgabe so erklären, wie Du sie jemandem erklärst, der KEINE Ahnung vom Programmieren hat (Land_in, Land_von… usw. ???)

Hoffe, Du nimmst mir das jetzt nicht krumm, aber vielleicht findest Du die Lösung ja von selbst, wenn Du die Aufgabe mit ein bißchen Abstand oder aus anderer Perspektive siehst.

Und eine dritte Tabelle bedeutet nicht gleichzeitig Datenredundanz.

Schönes WE

Hallo Ralf,

sorry, hab normalerweise echt Freude an Denksportaufgaben,
aber kannst Du Deine noch mal anders formulieren. Ich meine:

a) keine Worte weglassen

Ich habe den Artikel nochmals korrekturgelesen, konnte dabei aber nicht feststellen, daß ich Worte weggelassen hätte.

b) öfter mal Return drücken, um den Text zu gliedern

o.k.

c) die Aufgabe so erklären, wie Du sie jemandem erklärst, der
KEINE Ahnung vom Programmieren hat (Land_in, Land_von… usw.
???)

gut ich versuch’s mal übersichtlicher:

Tabelle 1

ID | Land_von_Name | Zone
1 | A | Z1
2 | B | Z2
3 | C | Z3
4 | D | Z2
5 | E | Z5

Tabelle 2

ID | Land_in_Name | Welt
1 | A | W4
2 | B | W2
3 | C | W6
4 | D | W1
5 | E | W4

Die Abfrage funktioniert, solange z.B. das Land „B“ aus Tabelle 2 immer die Zuordnung „W2“ hat, egal ob es nun aus Land A der Tabelle 1 (hier aus Z1) oder aus Land D (hier aus Z2) abgefragt wird.

Das Problem aber ist folgendes:

Diese Zuordnung wechselt, d.h. es besteht ein Unterschied, ob das Land B aus Tabelle 2 in der Abfrage mit dem Land A der Tabelle 1 (Z1) oder mit dem Land D
der Tabelle 1 (Z2) verknüpft wird.
Solange dieses Land B aus Land A erreicht werden soll, hat es die Zuordnung „W2“, wenn es aber aus Land D erreicht wird, soll es die Zuordnung „W4“ erhalten. Wie ist das am einfachsten zu lösen?

Hoffe, Du nimmst mir das jetzt nicht krumm, aber vielleicht
findest Du die Lösung ja von selbst, wenn Du die Aufgabe mit
ein bißchen Abstand oder aus anderer Perspektive siehst.

Du kannst mir wirklich glauben, daß ich seit ca. 1 Woche diese Problemstellung aus allen möglichen Blickwinkeln betrachtet und andere Lösungsansätze versucht habe. Aber ich bin entweder zu dämlich, oder es gibt keine andere Lösung, als die von mir beschriebene.

Auf einen Ansatz bin ich noch gekommen:

Tabelle 2

ID | Land_in_Name | ausZ1 | ausZ2 | ausZ3 | …

1 | A | W4 | W6 | W8 | …

ich weiß nur nicht, wie man die Abfrage gestaltet…

Und eine dritte Tabelle bedeutet nicht gleichzeitig
Datenredundanz.

Wenn man hier unbedingt eine Tabelle 3 benötigt, leider ja, denn:

Entweder muß man alle Länder der Tabelle 1 dem jeweiligen Land der Tabelle 2
zuordnen oder umgekehrt, was auf dasselbe rauskommt.

Schönes WE

gleichfalls…und erstmal vielen Dank für deine Reaktion

Hallo Ralf,

ich versuch’s mal, obwohl ich immer noch nicht weiß, ob ich genau kapiert hab, was Deine DB überhaupt machen soll :wink:

Die einfachste Lösung ist in meinen Augen eine 3. Tabelle mit folgendem Aufbau:

Tabelle 3

  1. Feld: ID
  2. Feld: ID_aus_Tabelle1
  3. Feld: ID_aus_Tabelle2

In der Tabelle speicherst Du nur die jeweiligen IDs aus den bestehenden Tabellen („Foreign Keys“). Das braucht nicht viel Speicherplatz.

Damit kannst Du dann diese „jede mit jedem“-Verknüpfung realisieren. Die Geschichte mit Datenredundanzen: Da sehe ich kein Problem; liegt vielleicht auch daran, das ich die Aufgabenstellung eventuell falsch verstanden habe :o|.

Performancetechnisch dürfte diese Lösung recht akzeptabel sein, und sie ist einfach; auch in ein paar Monaten noch einfach nachzuvollziehen.

Bin mal gespannt auf Deine Antwort :wink:

Hallo Steffen,

vielen Dank für Deine Antwort. Dein Vorschlag schließt sich meiner jetzigen Lösung an:

Ich würde in der dritten Tabelle natürlich nicht die Namen der Länder eintragen, sondern deren ID’s aus der Tabelle 2 („Land_in“). Die Länder der Tabelle 1 benötige ich eigentlich nicht einzeln, sondern nur deren Zonen-Zuordnung, da diese die entscheidende Rolle spielt.

Was ich mit der Tabelle will ( vielleicht wird es dann klarer ):

Es geht um einen Telefon-Tarifrechner. Die Länder der Tabelle 1 - dies sind die Ursprungsländer, also die Staaten, von denen aus der Anruf getätigt wird. Diese sind in Zonen von 1 - 8 eingeteilt.
Jedes Land einer Zone hat denselben Tarif: Länder der Zone 1 haben den Tarif 1, der Zone 2 den Tarif 2 usw. (Tarif: Preise für ankommende Anrufe, Voicemail, Rufweiterleitung …nicht die Minutenpreise, dazu weiter unten ).
Die Länder der Tabelle 2 sind die Zielländer, also die Staaten, in die telefoniert wird. Diese wiederum sind in Welt-Bereiche von 1 - 20 eingeteilt.
Soweit, sogut.
Es funktioniert alles prima, solange die Einteilung der Zielländer starr beleibt, d.h. das Land, das sich im Weltbereich „W4“ befindet, wenn es aus einem Land der Zone 1 angerufen wird, auch „W4“ hat, wenn es aus einem Land z.B. der Zone 3 angerufen wird.

Aber dies ist eben nicht so. Wenn dieses Land einen Anruf aus einem Land der Zone 3 bekommt, soll es eben nicht „W4“ haben, sondern „W6“.

ein praktisches Beispiel:
Ich rufe aus Deutschland ( Land der Zone „Z1“ ) nach Vietnam ( hier Land des Bereiches „W4“ ) an. Dies kostet mich 0.69 cent/min.
Mache ich dies z.B. aus Mazedonien ( Land der Zone „Z3“ ) kostet mich dies 0.89 cent/min - ich müßte also Vietnam dann irgendwie „W6“ zuordnen.

Warum muß ich den Minutenpreis an die Weltbereichseinteilung hängen?

Es wäre kein Problem, die Zordnung mit einer vierten Tabelle zu realisieren:

ID | Zone | Welt | MinPreis
1 | Z1 | W1 | 0.39
2 | Z1 | W2 | 0.49

20 | Z1 | W20 | 16.90
21 | Z2 | W1 | 0.49
22 | Z2 | W2 | 0.59

Das Problem dabei ist nur, daß nicht alle Länder, die von „Z1“-Ländern zu „W4“-Preisen angerufen werden, von „Z3“-Ländern zu „W6“-Preisen erreicht werden können. Manche bleiben bei „W4“, andere wechseln zu „W6“.
Die einzige Einteilung, die wirklich starr bleibt, ist die Zoneneinteilung der Ursprungsländer der Tabelle 1.

Viel Spaß beim Grübeln, ich hab ihn noch :smile:)

Ralf

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Steffen,

vielen Dank für Deine Antwort. Dein Vorschlag schließt sich
meiner jetzigen Lösung an:

Ich würde in der dritten Tabelle natürlich nicht die Namen der
Länder eintragen, sondern deren ID’s aus der Tabelle 2
(„Land_in“). Die Länder der Tabelle 1 benötige ich eigentlich
nicht einzeln, sondern nur deren Zonen-Zuordnung, da diese die
entscheidende Rolle spielt.

Was ich mit der Tabelle will ( vielleicht wird es dann klarer
):

Es geht um einen Telefon-Tarifrechner. Die Länder der Tabelle
1 - dies sind die Ursprungsländer, also die Staaten,
von denen aus der Anruf getätigt wird. Diese sind in
Zonen von 1 - 8 eingeteilt.
Jedes Land einer Zone hat denselben Tarif: Länder der Zone 1
haben den Tarif 1, der Zone 2 den Tarif 2 usw. (Tarif: Preise
für ankommende Anrufe, Voicemail, Rufweiterleitung …nicht
die Minutenpreise, dazu weiter unten ).
Die Länder der Tabelle 2 sind die Zielländer, also die
Staaten, in die telefoniert wird. Diese wiederum sind
in Welt-Bereiche von 1 - 20 eingeteilt.
Soweit, sogut.
Es funktioniert alles prima, solange die Einteilung der
Zielländer starr beleibt, d.h. das Land, das sich im
Weltbereich „W4“ befindet, wenn es aus einem Land der Zone 1
angerufen wird, auch „W4“ hat, wenn es aus einem Land z.B. der
Zone 3 angerufen wird.

Aber dies ist eben nicht so. Wenn dieses Land einen Anruf aus
einem Land der Zone 3 bekommt, soll es eben nicht „W4“ haben,
sondern „W6“.

ein praktisches Beispiel:
Ich rufe aus Deutschland ( Land der Zone „Z1“ ) nach Vietnam (
hier Land des Bereiches „W4“ ) an. Dies kostet mich 0.69
cent/min.
Mache ich dies z.B. aus Mazedonien ( Land der Zone „Z3“ )
kostet mich dies 0.89 cent/min - ich müßte also Vietnam dann
irgendwie „W6“ zuordnen.

Warum muß ich den Minutenpreis an die Weltbereichseinteilung
hängen?

Es wäre kein Problem, die Zordnung mit einer vierten Tabelle
zu realisieren:

ID | Zone | Welt | MinPreis
1 | Z1 | W1 | 0.39
2 | Z1 | W2 | 0.49

20 | Z1 | W20 | 16.90
21 | Z2 | W1 | 0.49
22 | Z2 | W2 | 0.59

Das Problem dabei ist nur, daß nicht alle Länder, die von
„Z1“-Ländern zu „W4“-Preisen angerufen werden, von
„Z3“-Ländern zu „W6“-Preisen erreicht werden können. Manche
bleiben bei „W4“, andere wechseln zu „W6“.
Die einzige Einteilung, die wirklich starr bleibt, ist die
Zoneneinteilung der Ursprungsländer der Tabelle 1.

Viel Spaß beim Grübeln, ich hab ihn noch :smile:)

Ralf

Hi Ralf,

sorry, wenn ich mich erst jetzt melde. Bin gerade am Umziehen und hab daher so gut wie null Zeit für was anderes.

Die Info mit dem Telefontarif-Umrechner ist wahrlich sehr hilfreich. Da kann man sich einfach mehr drunter vorstellen als unter irgendwelchen abstrakten Tabellen und Datenfeldern.

Kann Dir leider im Moment aus oben erwähnten Gründen - Zeitmangel - nicht konkret weiterhelfen, aber ich möchte Dir einen Tipp geben: Geh mal auf www.spotlight.de. Da gibt es ein sehr aktives SQL-Forum. Vielleicht weiß da ja jemand Rat oder hat vielleicht schon mal sowas gemacht.

Bis später
Steffen

Hallo Steffen,

vielen Dank für Deine Antwort und den Tip, ich werde es dort mal versuchen!

Schönes Wochenende

Ralf

Hi Ralf,

sorry, wenn ich mich erst jetzt melde. Bin gerade am Umziehen
und hab daher so gut wie null Zeit für was anderes.

Die Info mit dem Telefontarif-Umrechner ist wahrlich sehr
hilfreich. Da kann man sich einfach mehr drunter vorstellen
als unter irgendwelchen abstrakten Tabellen und Datenfeldern.

Kann Dir leider im Moment aus oben erwähnten Gründen -
Zeitmangel - nicht konkret weiterhelfen, aber ich möchte Dir
einen Tipp geben: Geh mal auf www.spotlight.de. Da gibt es ein
sehr aktives SQL-Forum. Vielleicht weiß da ja jemand Rat oder
hat vielleicht schon mal sowas gemacht.

Bis später
Steffen