db Problem mit Bonusprogramm für Neukundenwerbung

db Problem mit Bonusprogramm für Neukundenwerbung

am 18.03.2006 19:00:28 von Sebastian Gohres

Hi!

Bin dabei ein Skript zu schreiben, welches demjenigen, der einen neuen
Kunden/Benutzer wirbt, einen Punkt gibt.
Über eine Ebene wäre das auch kein Problem.
Das Problem ist, wenn der Neugeworbene ebenfalls einen Neuen wirbt,
sollen beide einen Punkt bekommen:

User 1 wirbt User 2. User 1 bekommt einen Punkt.
User 2 wirbt User 3. User 2 bekommt einen Punkt, User 1 bekommt einen Punkt.

Und so weiter. Die Tiefe ist unendlich.

Meine Tabelle sieht momentan so aus:

geworbender | geworben_von
2 1
3 2


Nun könnte ich in einer Schleife immer wieder eine Datenbank Abfrage
machen, die dann folgendes machen würde:

SELECT geworben_von FROM bonus WHERE geworbener = 3

dann gebe ich 2 einen Punkt und mache mit 2 einen neuen SELECT

SELECT geworben_von FROM bonus WHERE geworbener = 2

und gebe User 1 einen Punkt. Und wieder ein SELECT, ich weiss ja nicht,
dass 1 keinen über sich mehr hat:

SELECT geworben_von FROM bonus WHERE geworbener = 1
liefert kein Ergebnis - fertig.

Dieses Verfahren sehe ich als ineffizient an, besonders bei mehr Tiefen
und mehreren Benutzern
(Die "Start-ID" [im obrigen Beispiel die 3] ist immer die eigene ID)

Gibt es da einen eleganteren Weg?

Vielen Dank für die Hilfe!


MfG
S. Gohres

Re: db Problem mit Bonusprogramm für Neukundenwerbung

am 18.03.2006 23:37:27 von Bodo Kaelberer

Abend

Sebastian Gohres am Sat, 18 Mar 2006 19:00:28 +0100:

> Bin dabei ein Skript zu schreiben, welches demjenigen, der einen neuen
> Kunden/Benutzer wirbt, einen Punkt gibt.
> Über eine Ebene wäre das auch kein Problem.
> Das Problem ist, wenn der Neugeworbene ebenfalls einen Neuen wirbt,
> sollen beide einen Punkt bekommen:
>
> User 1 wirbt User 2. User 1 bekommt einen Punkt.
> User 2 wirbt User 3. User 2 bekommt einen Punkt, User 1 bekommt einen Punkt.
>
> Und so weiter. Die Tiefe ist unendlich.

na jetzt übertreibst Du aber (-;



> Meine Tabelle sieht momentan so aus:
>
> geworbender | geworben_von
> 2 1
> 3 2
>
>
> Nun könnte ich in einer Schleife immer wieder eine Datenbank Abfrage
> machen, die dann folgendes machen würde:
>
> SELECT geworben_von FROM bonus WHERE geworbener = 3
>
> dann gebe ich 2 einen Punkt und mache mit 2 einen neuen SELECT
>
> SELECT geworben_von FROM bonus WHERE geworbener = 2
>
> und gebe User 1 einen Punkt. Und wieder ein SELECT, ich weiss ja nicht,
> dass 1 keinen über sich mehr hat:
>
> SELECT geworben_von FROM bonus WHERE geworbener = 1
> liefert kein Ergebnis - fertig.
>
> Dieses Verfahren sehe ich als ineffizient an, besonders bei mehr Tiefen
> und mehreren Benutzern
> (Die "Start-ID" [im obrigen Beispiel die 3] ist immer die eigene ID)

Ich kenne den konkreten Anwendungsfall nicht, glaube aber, die Tiefe
hält sich dabei in Grenzen.

Und die Anzahl der Benutzer ist ja egal. Du musst nur in einem Baum
den Pfad zur Wurzel zurückfinden. Wieviele nicht zu beachtende
Abzweigungen es gibt, ist dabei nicht von Bedeutung.
Mir fällt kein Weg ein, wie das in einem Statement zu erreichen ist.


Unbedingt solltest Du, entweder bei der Pflege der Daten oder bei der
der Punktevergabe (besser: bei beidem), sicherstellen, dass Du nicht
in eine Schleife gerätst. Das kann passieren wenn durch einen
Pflegefehler (und wo gibt es die nicht) eine Person zum Werber seiner
selbst, des eigenen Vaters etc. wird. Fängst Du das nicht ab, dann
haben beim Timeout des Scriptes ein paar Benutzer ein paar Tausend
Punkte mehr.
Und um das zu prüfen musst Du IMHO ohnehin schrittweise vorgehen und
eine Liste der bereits abgearbeiteten Personen führen.


Bye

--
1 Bodo Kaelberer
123 http://www.webkind.de/ http://www.kaelberer-aio.de/
3 Dem Verständnis ist meist gut getan, wenn man richtig lesen
4 kann.

Re: db Problem mit Bonusprogramm für Neukundenwerbung

am 19.03.2006 07:29:03 von Johannes Vogel

Hi Sebastian

Sebastian Gohres wrote:
> Bin dabei ein Skript zu schreiben, welches demjenigen, der einen neuen
> Kunden/Benutzer wirbt, einen Punkt gibt.
> Über eine Ebene wäre das auch kein Problem.
> Das Problem ist, wenn der Neugeworbene ebenfalls einen Neuen wirbt,
> sollen beide einen Punkt bekommen:

[Schneeball-System]

> Und so weiter. Die Tiefe ist unendlich.
> Meine Tabelle sieht momentan so aus:
> geworbender | geworben_von
> 2 1
> 3 2
> Dieses Verfahren sehe ich als ineffizient an, besonders bei mehr Tiefen
> und mehreren Benutzern
> (Die "Start-ID" [im obrigen Beispiel die 3] ist immer die eigene ID)
> Gibt es da einen eleganteren Weg?

Du interessierst dich für Bäume in SQL. Dazu gibt es Nested Sets. Siehe
dazu in der Suchmaschine deiner Wahl weiter.

HTH, Johannes