Halihallo Andreas
Welches Format(schreibweise und Spaltenformat) würdet Ihr für eine derarige ID empfehlen?
Keine Fliesskommazahl! - Das könnte bei grossen ID's ins Verderben führen, es sei denn, dass die Genauigkeit so hoch ist, dass er auch die 20'ste Stelle noch richtig "abbildet" und nicht rundet. Naja, ich würde eigentlich ein Char nehmen (Index bei Varchar ist lange nicht so effizient); beim Char die Länge 20 oder so. So ist auch der Index noch sehr effizient (anders eben bei Varchar, da hier nur eine "Referenz" verwendet wird und die eigentlichen Daten nicht im Record sind).
Also kein "." als Trennzeichen. Vielleicht ein "-" oder ein "/"?
Du kannst auch gerne ein "." als Trennzeichen nehmen, womit du trennst spielt keine Rolle, nur, wenn du auf die, wie gesagt sehr waghalsige, Idee kommst, den Spaltentyp auf Float zu setzen.
Aber meinst Du das ist so ein Problem? Wenn ich schreibe "WHERE ID = '3.1234123422' sollte das doch als String verstanden werden, zumal es sich ja um keine "Zahlenspalte" handelt! Hast Recht mit Char, das werde ich dann nehmen.
Dies wird als Zahl behandelt, wenn der Spaltentyp einen Zahlentyp ist und wird als String behandelt, wenn es ein Stringtyp (CHAR) ist. Also, du wirst keine Probleme haben, wenn du den Spaltentyp auf einen geeigneten CHAR setzt (dir ist aber klar, dass du hier mit 4 Bytes nur 10000 Records ansprechen kannst; anders als INT - Werte).
- ich begrenze nicht den ID-Raum
- ich behalte eine einzige Eindeutige ID
- ich kann das System beim nächten größeren Update rel. problemlos auf 2-IDs umstellen
Ich glaube, dass dies hinhauen könnte. Bei den Selects verwendest du dann die DatensatzID, oder? - HerkunftsID ist eine eigene Spalte mit Default-Wert und die Synchronisation bringt das dann in eine ID "CHAR-ID". Habe ich das so verstanden?
Also wie folgt, eine Tabelle hat 5 Spalten:
ID,ClientID,HerkunftsID,timestamp,Vorname(Spalte mit Daten)
ClientID ist mit autoincrement "ausgestattet",
HerkunftsID steht standardmäßig z.B. auf 3, für Standort 3
Jetzt füge ich so Daten ein:
"INSERT INTO tabelle SET ID=HerkunftsID"-"LAST_INSERT_ID(), Vorname = 'Hugo'"
vermutlich geht da so nicht ;-) aber so in der Art wäre es mir am liebsten. LAST_INSERT_ID() sollte die neu erzeugte ClientID sein, und HerkunftsID soll den Standardwert aus selbiger Spalte zurückgeben.
Dann habe ich zwar die Information doppelt in jeder Tabelle stehen, aber dafür die zusammengesetze ID in einer Spalte. So vermeide ich das ich immer 2 Spalten zur eindeutigen Indentifikation benötige, und ich umgehe das Problem mit der nachträglichen Aktualisierung der verknüpften Datensätze.
OK. Verstehe. Dein pseudo-INSERT kannst du übrigens dennoch vollständig durch die DB erstellen:
nach jedem Insert...
UPDATE table SET ID=CONCAT(HerkunftsID, '-', ClientID) WHERE ID=0
so musst du das nicht "programmiertechnisch" lösen... Und wenn du über ID noch einen Index legst, ist diese Lösung sogar ziemlich performant. Das nur so als Tip nebenbei ;)
Viele Grüsse
Philipp