SQL [Frage] Datenbank mit aufsteigenden Nummern pro Mandant

Domi83

Commodore
Dabei seit
Feb. 2010
Beiträge
5.037
Hallo Leute, ich hoffe mal das mein Präfix richtig ist... Da es sich sowohl um PHP als auch MySQL dreht.

Mein Kollege und ich bauen eine Eingabemaske für Chef, wo er Kundendaten eintragen möchte etc., die Kunden sollen aufsteigende Nummern bekommen "auto-incrementel" ist hier mein Gedanke, aber das Spielchen geht noch weiter...

Er hat z.B. die Mitarbeiter Nummer 1001 und der Kunde 1, als nächstes käme 2 etc.! Wenn er nun eine Übersicht drucken möchte, sollen die Nummern wie folgt ausgegeben werden...
- 1001.1
- 1001.2
- 1001.3
- ...

Soweit kein Problem, nun möchte er aber einen zweiten Mitarbeiter anlegen (ID 1002), wenn dieser einen Kunden anlegt, soll aber der auto-incrementelle Wert wieder bei 1 beginnen, so dass die Nummern dann wie folgt aufsteigen...
- 1002.1
- 1002.2
- 1002.3
- ...

Mein Gedanke war jetzt eigentlich das jeder Mitarbeiter eine eigene Tabelle in der Datenbank bekommt, war ich allerdings doof finde.. Wenn mal ein Feld / Spalte angepasst wird, muss ich das in allen Mitarbeiter Tabellen erledigen. Gibt es eine Lösung, mit der ich es drehen kann das ich nur eine Mitarbeiter Tabelle habe, wo diese Zahlen wie beschrieben aufsteigen?

Oder muss ich in PHP eine Funktion bauen, die prüft welches die letzte Zahl von 1001 oder 1002 ist, und dann mit der nächsten Zahl weiter macht?!

Ich hoffe man versteht was ich suche oder vorhabe und man kann mir helfen :)
Mfg. Domi
 

Krafty

Lt. Commander
Dabei seit
Sep. 2009
Beiträge
1.177
Mir stellt sich dabei die Frage inwiefern das sinnvoll ist.

Widerspricht ziemlich dem Normalform Modell, wenn du für Kunden 2 unterschiedliche Tabellen anlegst, weil sie unterschiedlichen Mitarbeitern zugewiesen worden sind.

Was ist weiterhin mit dem Fall, wenn ein Mitarbeiter durch einen anderen ersetzt wird?
Dann hast du im schlechtesten Fall Kunden mit der selben (Unique) ID.

Wenn du die ID der Kunden weiterführend an den neuen Mitarbeiter anpasst, was passiert mit den Kundendatentabellen, welche auf die ID gezielt haben?

Welchen Zweck verfolgt ihr denn mit der angestrebten Nummerierung?
Muss die intern vorhanden sein oder reicht es wenn sie sich zweckmäßig nach außen abbilden lässt?
 

Domi83

Commodore
Ersteller dieses Themas
Dabei seit
Feb. 2010
Beiträge
5.037
Hm.. Okay, das es keiner Normalform entspricht kommt ja noch dazu.. An so etwas hab ich nicht gedacht. Chef ist nun keiner der sich mit PHP und Datenbanken auskennt, darum sagte ich nur "ich würde es in eine Tabelle packen", allerdings hab ich da keine Lösung wie ich das mit den aufsteigenden Nummern erledigen soll.

Im Prinzip sollte das mit den "Kunden" und den Mitarbeitern ein Beispiel sein.. Es dreht sich schon um Kundennummern, die aufsteigend in die Datenbank sollen, aber die ersten Ziffern sind nicht die Identifikations-Nummern von Mitarbeitern, sondern von Partnern...

Ich könnte ja nun in der Tabelle "Kunden" einen Primärschlüssel ID anlegen, und dann ein weiteres INT Feld mit "PID", wenn ich mich jetzt aber nicht irre.. Bringt das Chef seinen Wunsch durcheinander. Folgendes Beispiel, ich trage den ersten Kunden ein, somit würde dieser die ID 1001.1 bekommen, trage ich den zweiten ein, wäre es 1001.2, nun trägt aber der zweite Partner einen Kunden ein, somit würde es ja dann folgende Nummer sein 1002.3 und Chef möchte nicht das dann die Nr 3 kommt, sondern das 1002.1 kommt.

Ich würde das alles auch gerne bauen, hab aber gerade noch keine Idee wie ich das umsetze.. So, ich hoffe damit konnte ich besser erklären was mein Wunsch ist :)
 

Krafty

Lt. Commander
Dabei seit
Sep. 2009
Beiträge
1.177
Deshalb ja meine Frage ob es zwangsläufig intern so abgebildet werden muss, oder ob es reicht wenn sich aus den vorhandenen Datenbankwerten dann extern sowas zusammensuchen lässt.

Prinzipiell lässt sich natürlich auch eine 1001.1 als Unique ID verwenden, nur mit dem auto increment haut es dann nicht mehr hin und man muss die Datenbank per Hand pflegen, ggf. über CONSTRAINTS.

Wenn man CONTRAINTS einmal verstanden hat, können sie ziemlich mächtig sein, dann brauchst du im Fall der Fälle nur an einer Stelle was ändern und die Änderungen werden automatisch auf die Bezugstabellen übernommen.

Aber du solltest wirklich einiges an Zeit in das Datenbank-Design stecken, sowas vermeidet Frust im Nachhinein.
 

aelo

Lt. Junior Grade
Dabei seit
Aug. 2006
Beiträge
280
Erstelle zwei Tabellen:

Ta_Employee
* Primary Key (Autoincrement ab 1)
* Name usw...

Ta_Customer
* Id (Primary-Key, Autoincrement ab 1)
* Pid (integer)
* Employee (Foreign Key zu Mitarbeiter der für ihn zuständig ist)
* Restliche Infos...

wenn dein Chef nun die Ausgabe eben anders haben will dann stellst es ihm eben so dar:

Code:
select * from Ta_Employee e inner join Ta_Customer c on e.Id = c.Employee

Bei der Ausgabe zählst dann 1000 hinzu bei der Emloyee-Nummer oder startest das Autoincrement bei 1000.

Bei der Kundennummer speicherst irgendwas ab als id und zusätzlich eine PID die eben bei jedem Mitarbeiter ab 1 startet. Dann kannst du dann bei der Ausgabe die beiden Nummern zusammenhängen und du hast die Nummern die dein Chef möchte.

Achja beim insert für einen neuen Kunden müsstest du dann eben nachsehen in der DB welches die aktuell höchste Kundennummer des bestimmten Mitarbeiters ist. Sie dann um 1 erhöhen und beim neuen Kunden als Pid speichern.

Irgendwas unklar? :-)

mfg
aelo
 

Domi83

Commodore
Ersteller dieses Themas
Dabei seit
Feb. 2010
Beiträge
5.037
Ja, dass mit dem "nach schauen" welches die höchste Nummer für einen Employee ist und dann +1 machen, dachte ich mir schon fast, so etwas habe ich vorhin zu meinem Kollegen auch schon gesagt das ich das so bauen muss...

Aber gut, dann hätte ich wenigstens eine Bestätigung für einen Ansatz den ich auch hatte. Wobei ich fast gedacht hätte, es gäbe noch eine charmantere Variante. Aber gut, die ist top und wird übernommen :)

Vielen Dank
Gruß, Domi
 

IceMatrix

Lt. Commander
Dabei seit
Jan. 2008
Beiträge
1.535
du kannst bei nem insert sowas auch geschickt über eine einzelne insert anfrage tun..
beispiel. insert into xxxx (id, pid, employee, ..) values (null, (select max(pid) + 1 from ta_customer where employee = ...), ...)
 
Top