Discussion:
Unique ID erzeugen ?
(zu alt für eine Antwort)
Andreas Kammann
2006-09-24 07:51:44 UTC
Permalink
Hallo wie kann ich eine Unique ID (Buchstaben , Zahlen Kombination)
erzeugen, ohne eine GUID zu benutzen ?
Was habe ich da für Möglichkeiten ?

Gruss
Peter Götz
2006-09-24 08:11:04 UTC
Permalink
Hallo Andreas,
Post by Andreas Kammann
Hallo wie kann ich eine Unique ID (Buchstaben , Zahlen Kombination)
erzeugen, ohne eine GUID zu benutzen ?
Was habe ich da für Möglichkeiten ?
Da musst Du Dir erst mal die Frage selbst beantworten, wozu Deine IDs
"unique" sein sollen.
Wenn es wirklich eindeutige, weltweit nicht mehrfach vorkommende Werte
sein sollen sind GUIDs das Mittel der Wahl.
Da GUIDs sehr einfach zu erzeugen sind und auch bei deren Verwaltung
und Verarbeitung keine sonderlichen Probleme zu erwarten sind, verstehe
ich nicht, warum Du nach Alternativen suchst.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
Andreas Kammann
2006-09-24 09:54:19 UTC
Permalink
Hi Peter, ich wollte nur etwas haben was ca. 10 Zeichen lang ist.
Peter Fleischer
2006-09-24 10:26:35 UTC
Permalink
Post by Andreas Kammann
Hi Peter, ich wollte nur etwas haben was ca. 10 Zeichen lang ist.
Andreas,
nimm einfach die Zeichedarstellung eines Autowertes. Ein paar Buchstaben
kannst du ja mit Zufallsgenerator noch hinzufügen.

Peter
Peter Götz
2006-09-24 14:04:27 UTC
Permalink
Hallo Andreas,
Post by Andreas Kammann
Hi Peter, ich wollte nur etwas haben was ca. 10 Zeichen lang ist.
Damit lässt sich halt leider kein wirklich "globally unique" (weltweit
eindeutiger) Wert erzeugen.

Deine Frage kann man kaum beantworten, wenn man nicht weiss, in welchem
Umfang Du solche IDs benötigst, in welchem Umfeld sie eindeutig sein
sollen oder ganz einfach mal gefragt, was willst Du mit diesen IDs denn
konkret anstellen?

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
D. Gottschaldt
2006-09-24 13:07:37 UTC
Permalink
Siehe u. g. Funktion newID.

Verwendungsbeispiel:


Dim o as Object

Alphanumerische ID:
o = newID(0)

Numerische ID:
o = newID(1)

Unique Identifier (GUID):
o=newID(11)




Public Function newID( _
Optional ByVal IDTYPE As Integer = 1, _
Optional ByVal UPPERLIMIT As Long = 2147483640, _
Optional ByVal LOWERLIMIT As Long = 1000000000, _
Optional ByVal INCRNUM As Object = -1, _
Optional ByVal iALPHANUMERICLENGTH As Integer = 10) As Object

Dim s As Object

Dim i As Integer
Dim k As Integer


Randomize()


s = ""


Select Case IDTYPE


'Alphanumeric
Case 0
s = ""

For i = 1 To iALPHANUMERICLENGTH

Randomize()

k = Int((1 - 0 + 1) * Rnd() + 0)

Randomize()

Select Case k
Case 0
s = s & Chr(Int((57 - 48 + 1) * Rnd() + 48))
Case Else
s = s & Chr(Int((122 - 97 + 1) * Rnd() + 97))
End Select

Next i


'Numeric
Case 1

If INCRNUM > -1 Then
s = Replace(INCRNUM, "S", "", , , vbTextCompare) + 1
Else
s = Int((UPPERLIMIT - LOWERLIMIT + 1) * Rnd() +
LOWERLIMIT)
End If

s = CDec(s)


'GUID
Case 11

Dim gVAL As Guid

gVAL = Guid.NewGuid()

s = UCase(gVAL.ToString)

s = "{" & s & "}"

End Select

newID = Trim(s)

End Function
Harald M. Genauck
2006-09-24 14:27:06 UTC
Permalink
Hallo,
Post by D. Gottschaldt
Siehe u. g. Funktion newID.
...
Public Function newID( _
...
k = Int((1 - 0 + 1) * Rnd() + 0)
...
s = Int((UPPERLIMIT - LOWERLIMIT + 1) * Rnd() +
LOWERLIMIT)
Und was verhindert, dass morgen, übermorgen, nächste Woche, nächsten Monat,
oder nächstes Jahr die gleichen Zahlen "gezogen" werden?


Viele Grüße

Harald M. Genauck

ABOUT Visual Basic - das Webmagazin - http://www.aboutvb.de
"visual studio one" - http://www.visualstudio1.de
D. Gottschaldt
2006-09-26 08:02:46 UTC
Permalink
Post by Harald M. Genauck
Und was verhindert, dass morgen, übermorgen, nächste Woche, nächsten
Monat, oder nächstes Jahr die gleichen Zahlen "gezogen" werden?
Nichts verhindert das. Genauso wenig, wie nichts verhindert, daß morgen,
übermorgen, nächste Woche, nächsten Monat oder nächstes Jahr genau meine
Lottozahlen gezogen werden (wenn ich denn Lotto spielen würde). Betrachte
mal die Anzahl der möglichen Kombinationen und dann kannst Du die
Wahrscheinlichkeit von doppelten IDs erkennen. Ich habe diese Funktion in
einem meiner Programme (ca. 3 mio. Datensätze p. Datenbank) über mehrere
Jahre eingesetzt und laut Protokoll kam es dabei zu genau einem solchen
Vorfall, der natürlich in der Fehlerbehandlung abgefangen wurde.
Sicher sind GUIDs zu bevorzugen, aber in manchen Fällen sind diese eben
einfach nicht erwünscht, aus welchen Gründen auch immer.

Gruß

Dragan Gottschaldt
Post by Harald M. Genauck
Hallo,
Post by D. Gottschaldt
Siehe u. g. Funktion newID.
...
Public Function newID( _
...
k = Int((1 - 0 + 1) * Rnd() + 0)
...
s = Int((UPPERLIMIT - LOWERLIMIT + 1) * Rnd() +
LOWERLIMIT)
Und was verhindert, dass morgen, übermorgen, nächste Woche, nächsten
Monat, oder nächstes Jahr die gleichen Zahlen "gezogen" werden?
Viele Grüße
Harald M. Genauck
ABOUT Visual Basic - das Webmagazin - http://www.aboutvb.de
"visual studio one" - http://www.visualstudio1.de
HKSHK
2006-09-24 14:16:02 UTC
Permalink
Sehr geehrter Herr Kammann,
Post by Andreas Kammann
Hallo wie kann ich eine Unique ID (Buchstaben , Zahlen Kombination)
erzeugen, ohne eine GUID zu benutzen ?
Was habe ich da für Möglichkeiten ?
Nehmen Sie doch die SID des jeweiligen Benutzeraccounts oder, falls
es nicht den Nutzer, sondern nur den Rechner identifizieren soll,
ohne die letzten 3 bzw. 4 Ziffern.

Beste Grüße,

HKSHK
Andreas Kammann
2006-09-24 19:38:07 UTC
Permalink
Hi, danke euch. Ich benötige die ID um einen Artikel Datensatz zu
kennzeichnen (GruppenID)
Ich weiß auch nicht ob die Idee die ich so habe richtig ist. Aber die Sachen
von Herrn Gottschald sind ganz gut.
Harald M. Genauck
2006-09-24 20:08:04 UTC
Permalink
Hallo Andreas,
Post by Andreas Kammann
Hi, danke euch. Ich benötige die ID um einen Artikel Datensatz zu
kennzeichnen (GruppenID)
Ich weiß auch nicht ob die Idee die ich so habe richtig ist. Aber die Sachen
von Herrn Gottschald sind ganz gut.
Da, wo seine Funktion einen GUID liefert, ja - aber dafür brauchts diesen
Aufwand nicht. Ansonsten liefert seine Funktion nicht wirklich garantiert
eindeutige Schlüssel - schlimmstenfalls kann der Zufallsgenerator sogar
zweimal hintereinander den gleichen Schlüssel liefern.


Viele Grüße

Harald M. Genauck

ABOUT Visual Basic - das Webmagazin - http://www.aboutvb.de
"visual studio one" - http://www.visualstudio1.de
Peter Götz
2006-09-25 06:34:14 UTC
Permalink
Hallo Andreas,
Post by Andreas Kammann
Hi, danke euch. Ich benötige die ID um einen Artikel Datensatz zu
kennzeichnen (GruppenID)
Dazu brauchst Du in der Tat nicht unbedingt GUIDs. Auch wenn Du einige
zigtausend verschiedene Artikel verwalten willst/musst, würde da schon
simple Nummern (Typ Integer) genügen.
Wenn Du, wie zu vermuten ist, Deine Artikel in einer Datenbanktabelle
speicherst, kannst Du bei der Neuanlage eines Artikels im einfachsten
Fall mit Autowerten für die Artikelnummer (ID) arbeiten oder wenn Du
das aus irgendwelchen Gründen nicht willst, ist es relativ einfach mit
einem entsprechenden SQL-Statement die bisher höchste oder anderweitig
noch freie Nummer zu ermitteln und dann entweder die nächste freie oder
eben nächsthöhere Nummer für einen neuen Artikeldatensatz zu verwenden.
Post by Andreas Kammann
Ich weiß auch nicht ob die Idee die ich so habe richtig ist. Aber die Sachen
von Herrn Gottschald sind ganz gut.
Na ja, das solltest Du Dir nochmal genauer ansehen. Wirklich eindeutige
IDs bekommst Du damit nicht und wenn es tatsächlich nur um eine
Unterscheidung innerhalb Deines Programmes und nicht um weltweit
eindeutige Werte geht, dann kannst Du noch freie Nummern innerhalb
eines bestimmten Nummernkreises erheblich einfacher ermitteln.

Wie soll den so ein Artikeldatensatz aussehen (Felder/Datentypen) und
wo sollen diese Daten gespeichert werden?

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
D. Gottschaldt
2006-09-26 08:08:43 UTC
Permalink
Post by Peter Götz
das aus irgendwelchen Gründen nicht willst, ist es relativ einfach mit
einem entsprechenden SQL-Statement die bisher höchste oder anderweitig
noch freie Nummer zu ermitteln und dann entweder die nächste freie oder
eben nächsthöhere Nummer für einen neuen Artikeldatensatz zu verwenden.
Und was ist mit den Fällen, in denen mehrere Datenbanken synchronisiert
werden müssen, wie etwa in Filialsystemen, bzw. Außendienstorganisationen,
wo Notebooks bei Neuanlagen nicht am Netz sind und somit auch nicht
zuverlässig die Folgenummer ermitteln können? Ich denke, daß Zufallszahlen
oder Zufallszeichenfolgen in solchen Fällen die am wenigsten schlechte
Lösung sind, vorausgesetzt, man verwendet Ober- und Untergrenzen mit
entsprechend großen Bereichen.
Ansonsten siehe meine Antwort an H. M. Genauck etwas weiter oben.

Gruß

Dragan Gottschaldt
Post by Peter Götz
Hallo Andreas,
Post by Andreas Kammann
Hi, danke euch. Ich benötige die ID um einen Artikel Datensatz zu
kennzeichnen (GruppenID)
Dazu brauchst Du in der Tat nicht unbedingt GUIDs. Auch wenn Du einige
zigtausend verschiedene Artikel verwalten willst/musst, würde da schon
simple Nummern (Typ Integer) genügen.
Wenn Du, wie zu vermuten ist, Deine Artikel in einer Datenbanktabelle
speicherst, kannst Du bei der Neuanlage eines Artikels im einfachsten
Fall mit Autowerten für die Artikelnummer (ID) arbeiten oder wenn Du
das aus irgendwelchen Gründen nicht willst, ist es relativ einfach mit
einem entsprechenden SQL-Statement die bisher höchste oder anderweitig
noch freie Nummer zu ermitteln und dann entweder die nächste freie oder
eben nächsthöhere Nummer für einen neuen Artikeldatensatz zu verwenden.
Post by Andreas Kammann
Ich weiß auch nicht ob die Idee die ich so habe richtig ist. Aber die
Sachen
Post by Andreas Kammann
von Herrn Gottschald sind ganz gut.
Na ja, das solltest Du Dir nochmal genauer ansehen. Wirklich eindeutige
IDs bekommst Du damit nicht und wenn es tatsächlich nur um eine
Unterscheidung innerhalb Deines Programmes und nicht um weltweit
eindeutige Werte geht, dann kannst Du noch freie Nummern innerhalb
eines bestimmten Nummernkreises erheblich einfacher ermitteln.
Wie soll den so ein Artikeldatensatz aussehen (Felder/Datentypen) und
wo sollen diese Daten gespeichert werden?
Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
Peter Götz
2006-09-26 08:44:14 UTC
Permalink
Hallo Dragan,
Post by D. Gottschaldt
Post by Peter Götz
das aus irgendwelchen Gründen nicht willst, ist es relativ einfach mit
einem entsprechenden SQL-Statement die bisher höchste oder
anderweitig
Post by D. Gottschaldt
Post by Peter Götz
noch freie Nummer zu ermitteln und dann entweder die nächste freie oder
eben nächsthöhere Nummer für einen neuen Artikeldatensatz zu verwenden.
Und was ist mit den Fällen, in denen mehrere Datenbanken
synchronisiert
Post by D. Gottschaldt
werden müssen,
Wenn Du schon mein Posting zitierst, dann solltest Du es so tun, dass
es nicht sinnentstellt wird.
Ich habe geschrieben:

"Wenn Du, wie zu vermuten ist, Deine Artikel in einer
Datenbanktabelle speicherst, kannst Du bei der
Neuanlage eines Artikels im einfachsten Fall ..."

"Eine Datenbanktabelle" ist eben nur eine Tabelle und nicht mehrer
Datenbanken.
Post by D. Gottschaldt
wie etwa in Filialsystemen, bzw. Außendienstorganisationen,
wo Notebooks bei Neuanlagen nicht am Netz sind und somit auch nicht
zuverlässig die Folgenummer ermitteln können?
Hierzu genügt ein Verweis auf das Thema "Replikation".
Ansonsten s.oben (eine Tabelle)
Post by D. Gottschaldt
Ich denke, daß Zufallszahlen
oder Zufallszeichenfolgen in solchen Fällen die am wenigsten
schlechte
Post by D. Gottschaldt
Lösung sind, vorausgesetzt, man verwendet Ober- und Untergrenzen mit
entsprechend großen Bereichen.
Wie der Name schon sagt, sind Zufallszahlen eben leider nur zufällg und
es ist somit keine systematische Eindeutigkeit zu erwarten. Ich denke
darüber muss man nicht lange diskutieren.
Post by D. Gottschaldt
Ansonsten siehe meine Antwort an H. M. Genauck etwas weiter oben.
In der Du selbst berichtest, dass mit Zufallsdaten eben doch Duplikate
vorkommen können.

Ich kenne bisher auch keinen triftigen Grund, warum man für die
eindeutige Identifizierung von Datensätzen, falls eine solche
erforderlich ist, keine GUIDs, also simple numerische, 16 Byte lange,
Werte verwenden sollte. Sie stellen weder übermässige Anforderungen an
verfügbaren Speicher, noch bereiten sie irgendwelche unlösbaren
Probleme bei der Ver- und Bearbeitung. Und solange die Eindeutigkeit
von Datensätzen lediglich innerhalb einer einzigen DB-Tabelle gefordert
ist, kommt man auch mit numerischen Autowerten aus, deren Länge meist
sogar mit nur 4 oder 8 Byte ausreichend ist.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
D. Gottschaldt
2006-09-26 09:25:11 UTC
Permalink
Hallo Peter,

sinnentstellt war Dein Zitat nicht wirklich, weil weiter unten der
vollständige Text enthalten war und an oberster Stelle lediglich der Bezug
sein sollte.

OK, grundsätzlich magst Du ja recht haben, aber man muß akzeptieren, daß es
ab und zu mal Anforderungen abseits der reinen Lehre gibt, die es notwendig
machen, eine nicht optimale Lösung zu wählen. So z. B. bei den im
Eingangspost beschriebenen Beispiel. Aus Deiner eigenen Erfahrung wirst Du
bestimmt auch Pflichtenhefte kennen, bei denen man sich an den Kopf greifen
muß, den Kunden aber schlichtweg nicht von der Unsinnigkeit einer solchen
Vorgehensweise überzeugen kann, selbst wenn man mit einer mehrköpfigen
Beratermannschaft aufläuft. Als Beispiel, welches in diesem speziellen Fall
wohl nicht relevant ist, sei nur genannt, wenn man Datensätze im eigenen
Programm erzeugt, und diese in ein Fremdsystem exportieren muß, welches eben
nicht mit GUIDs, sondern z. B. (alpha-)numerischen IDs arbeitet. Oder auch,
wenn Datensätze des eigenen Programms mit Datensätzen von Fremdsystemen
gemischt werden müssen, was zumindest bei meinen Projekten fast
ausschließlich der Fall ist. Da würde es nicht unbedingt Sinn machen, zwei
Arten von IDs zu pflegen.

Ja, natürlich kann es zu Duplikaten kommen, aber wie gesagt: betrachte mal
selbst die Wahrscheinlichkeit und die relativ einfachen Möglichkeiten, das
abzufangen.

Im übrigen mal einen herzlichen Dank an Dich und die anderen
Newsgroup-Cracks hier; als ich vor ca. 8 Jahren durch einen ziemlich blöden
Zufall meinen anständigen Beruf als Dipl.-Betriebswirt aufgab und in die
"Niederungen" der Softwareentwicklung hinabstieg, waren es Deine Seiten,
Beiträge (wie auch die von H. M. Genauck, E. Boye und diversen anderen
Ungenannten), die es mir ermöglicht haben, mich in die Geschichte
einzuarbeiten und Unmengen von Fehlern zu vermeiden.

Gruß

Dragan Gottschaldt
Post by Peter Götz
Hallo Dragan,
Post by D. Gottschaldt
Post by Peter Götz
das aus irgendwelchen Gründen nicht willst, ist es relativ einfach
mit
Post by D. Gottschaldt
Post by Peter Götz
einem entsprechenden SQL-Statement die bisher höchste oder
anderweitig
Post by D. Gottschaldt
Post by Peter Götz
noch freie Nummer zu ermitteln und dann entweder die nächste freie
oder
Post by D. Gottschaldt
Post by Peter Götz
eben nächsthöhere Nummer für einen neuen Artikeldatensatz zu
verwenden.
Post by D. Gottschaldt
Und was ist mit den Fällen, in denen mehrere Datenbanken
synchronisiert
Post by D. Gottschaldt
werden müssen,
Wenn Du schon mein Posting zitierst, dann solltest Du es so tun, dass
es nicht sinnentstellt wird.
"Wenn Du, wie zu vermuten ist, Deine Artikel in einer
Datenbanktabelle speicherst, kannst Du bei der
Neuanlage eines Artikels im einfachsten Fall ..."
"Eine Datenbanktabelle" ist eben nur eine Tabelle und nicht mehrer
Datenbanken.
Post by D. Gottschaldt
wie etwa in Filialsystemen, bzw. Außendienstorganisationen,
wo Notebooks bei Neuanlagen nicht am Netz sind und somit auch nicht
zuverlässig die Folgenummer ermitteln können?
Hierzu genügt ein Verweis auf das Thema "Replikation".
Ansonsten s.oben (eine Tabelle)
Post by D. Gottschaldt
Ich denke, daß Zufallszahlen
oder Zufallszeichenfolgen in solchen Fällen die am wenigsten
schlechte
Post by D. Gottschaldt
Lösung sind, vorausgesetzt, man verwendet Ober- und Untergrenzen mit
entsprechend großen Bereichen.
Wie der Name schon sagt, sind Zufallszahlen eben leider nur zufällg und
es ist somit keine systematische Eindeutigkeit zu erwarten. Ich denke
darüber muss man nicht lange diskutieren.
Post by D. Gottschaldt
Ansonsten siehe meine Antwort an H. M. Genauck etwas weiter oben.
In der Du selbst berichtest, dass mit Zufallsdaten eben doch Duplikate
vorkommen können.
Ich kenne bisher auch keinen triftigen Grund, warum man für die
eindeutige Identifizierung von Datensätzen, falls eine solche
erforderlich ist, keine GUIDs, also simple numerische, 16 Byte lange,
Werte verwenden sollte. Sie stellen weder übermässige Anforderungen an
verfügbaren Speicher, noch bereiten sie irgendwelche unlösbaren
Probleme bei der Ver- und Bearbeitung. Und solange die Eindeutigkeit
von Datensätzen lediglich innerhalb einer einzigen DB-Tabelle gefordert
ist, kommt man auch mit numerischen Autowerten aus, deren Länge meist
sogar mit nur 4 oder 8 Byte ausreichend ist.
Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
Harald M. Genauck
2006-09-26 11:43:04 UTC
Permalink
Hallo Dragan,
Post by D. Gottschaldt
OK, grundsätzlich magst Du ja recht haben, aber man muß akzeptieren, daß
es ab und zu mal Anforderungen abseits der reinen Lehre gibt, die es
notwendig machen, eine nicht optimale Lösung zu wählen. So z. B. bei den
im Eingangspost beschriebenen Beispiel. Aus Deiner eigenen Erfahrung
wirst Du bestimmt auch Pflichtenhefte kennen, bei denen man sich an den
Kopf greifen muß, den Kunden aber schlichtweg nicht von der Unsinnigkeit
einer solchen Vorgehensweise überzeugen kann, selbst wenn man mit einer
mehrköpfigen Beratermannschaft aufläuft.
Mir ist sowas in der Art auch schon des öfteren begegnet. Meistens blieb es
dabei nicht bei einem einzigen derartigen Klops, so dass ich denn auch
meistens solche Aufträge gar nicht erst weiter- bzw. ausgeführt habe - mit
solchen Kunden gibt es in der Regel im Projektverlauf zu viel Ärger.
Post by D. Gottschaldt
Als Beispiel, welches in diesem speziellen Fall wohl nicht relevant ist,
sei nur genannt, wenn man Datensätze im eigenen Programm erzeugt, und
diese in ein Fremdsystem exportieren muß, welches eben nicht mit GUIDs,
sondern z. B. (alpha-)numerischen IDs arbeitet.
Wo ist das grundsätzliche Problem, auch dort GUIDs weiterzuverwenden? In
Stringform sind sie alphanumerisch, und nach wie vor eindeutig. Numerisch
sind sie ja schon per se.

Sollte aber ein anderes System ein spezifisches ID-Format erwarten, ist
dieses entweder bekannt, so dass man tatsächlich einen dafür passenden
Generator bauen kann (und evtl. muss, falls das importierende System kein
API dafür anbietet). Oder mögliche Formate sind noch nicht vorausschaubar -
aber dann kann jede Wahl eines Formats später genau die falsche gewesen
sein.

Ansonsten, mal zurück zum Zufall - allfällige Assoziationen:
Zufahrlässigkeit
Zufall-Lässigkeit
;-)
Post by D. Gottschaldt
Oder auch, wenn Datensätze des eigenen Programms mit Datensätzen von
Fremdsystemen gemischt werden müssen, was zumindest bei meinen Projekten
fast ausschließlich der Fall ist. Da würde es nicht unbedingt Sinn
machen, zwei Arten von IDs zu pflegen.
Siehe oben: Wenn die Fremdformate bekannt sind, gibt es vieles zu
überlegen, nicht nur das Format alleine. Ist es nicht bekannt, ist jede
Überlegung vorher müßig.
Post by D. Gottschaldt
Ja, natürlich kann es zu Duplikaten kommen, aber wie gesagt: betrachte
mal selbst die Wahrscheinlichkeit und die relativ einfachen
Möglichkeiten, das abzufangen.
Mit welchen Kosten abfangen? Jedesmal erst prüfen, ob ein vergebener Index
bereits vergeben ist, oder fehlschlagende Einfügeversuche abfangen? Beides
ziemlich hohe Kosten, finde ich.
Post by D. Gottschaldt
Im übrigen mal einen herzlichen Dank an Dich und die anderen
Newsgroup-Cracks hier; als ich vor ca. 8 Jahren durch einen ziemlich
blöden Zufall meinen anständigen Beruf als Dipl.-Betriebswirt aufgab und
in die "Niederungen" der Softwareentwicklung hinabstieg, waren es Deine
Seiten, Beiträge (wie auch die von H. M. Genauck, E. Boye und diversen
anderen Ungenannten), die es mir ermöglicht haben, mich in die Geschichte
einzuarbeiten und Unmengen von Fehlern zu vermeiden.
Danke, das ist nett, das auch mal zu hören...
;-)


Viele Grüße

Harald M. Genauck

ABOUT Visual Basic - das Webmagazin - http://www.aboutvb.de
"visual studio one" - http://www.visualstudio1.de
D. Gottschaldt
2006-09-26 19:30:49 UTC
Permalink
Hallo Harald,
Post by Peter Götz
Hallo Dragan,
Post by D. Gottschaldt
OK, grundsätzlich magst Du ja recht haben, aber man muß akzeptieren, daß
es ab und zu mal Anforderungen abseits der reinen Lehre gibt, die es
notwendig machen, eine nicht optimale Lösung zu wählen. So z. B. bei den
im Eingangspost beschriebenen Beispiel. Aus Deiner eigenen Erfahrung
wirst Du bestimmt auch Pflichtenhefte kennen, bei denen man sich an den
Kopf greifen muß, den Kunden aber schlichtweg nicht von der Unsinnigkeit
einer solchen Vorgehensweise überzeugen kann, selbst wenn man mit einer
mehrköpfigen Beratermannschaft aufläuft.
Mir ist sowas in der Art auch schon des öfteren begegnet. Meistens blieb es
dabei nicht bei einem einzigen derartigen Klops, so dass ich denn auch
meistens solche Aufträge gar nicht erst weiter- bzw. ausgeführt habe - mit
solchen Kunden gibt es in der Regel im Projektverlauf zu viel Ärger.
Klar, ist manchmal auch sinnvoller, aber andererseits bin ich so dermaßen
käuflich :-)
Im Ernst: bei Aufträgen im 6- oder zumindest mitleren 5-stelligen Bereich
(leider nicht an der Tagesordnung) überlegt man sich schon sehr genau, ob
man dem Kunden dann eben nicht seinen Willen läßt. Es läßt sich ja
schriftlich fixieren, was man rät und welche Lösung der Kunde letztendlich
durchsetzt - mit den Konsequenzen, die sich daraus ergeben. Siehe es mal
positiv: damit generiert der Kunde selbst für Leute wie uns Folgeaufträge,
indem er uns später Sachen korrigieren läßt, vor denen man ihn vorher schon
ehrlicherweise gewarnt hat.
Post by Peter Götz
Post by D. Gottschaldt
Als Beispiel, welches in diesem speziellen Fall wohl nicht relevant ist,
sei nur genannt, wenn man Datensätze im eigenen Programm erzeugt, und
diese in ein Fremdsystem exportieren muß, welches eben nicht mit GUIDs,
sondern z. B. (alpha-)numerischen IDs arbeitet.
Wo ist das grundsätzliche Problem, auch dort GUIDs weiterzuverwenden? In
Stringform sind sie alphanumerisch, und nach wie vor eindeutig. Numerisch
sind sie ja schon per se.
OK, und jetzt nimm mal einen Fall an, wo die ID 7-, 8- oder 10-stellig sein
muß und schon ist es vorbei mit den guten Vorsätzen. Oder der noch
schlimmere Fall, wenn bereits eine gewisse Systematik existiert, mit der IDs
gebildet werden. Ganz zu schweigen von Uraltsystemen, die etwa auf AS400
laufen und schon vor 20 Jahren konzipiert wurden. Zwar werden j auch diese
in der Regel kontinuierlich weiterentwickelt und modernisiert, aber die
wenigsten greifen dabei auch die ID-Thematik auf. Dazu kommen noch die
Fälle, in denen Software von den Betrieben selbst konfiguriert und teilweise
umprogrammiert wird (bei manchen mühelos möglich) und IDs nach Kriterien
gebildet werden, die den Erfordernissen des Betriebs entsprechen (oder halt
auch zufällig entstehen) und sich nicht nach professionellen
Programmierrichtlinien ausrichten.
Post by Peter Götz
Sollte aber ein anderes System ein spezifisches ID-Format erwarten, ist
dieses entweder bekannt, so dass man tatsächlich einen dafür passenden
Generator bauen kann (und evtl. muss, falls das importierende System kein
API dafür anbietet). Oder mögliche Formate sind noch nicht
vorausschaubar -
aber dann kann jede Wahl eines Formats später genau die falsche gewesen
sein.
Eben. Und meine Funktion ist halt nichts anderes als ein solchen
ID-Generator. Nicht elegant, aber sie hat bisher ihren Zweck erfüllt.
Wegen diverser Gründe mache ich Anbindungen von Fremdsystemen fast
ausschließlich über die Datenbank und seltenst über bereitgestellte
Schnittstellen. Gerade das ist bei vielen der Knackpunkt: Für die Zwecke,
die zumindest meine Kunden benötigen, reichen die von den Herstellern
bereitgestellten APIs und Schnittstellen nicht aus.
Post by Peter Götz
Zufahrlässigkeit
Zufall-Lässigkeit
;-)
Klar, aber mach mal eine Schleife, die IDs aus meiner Funktion erzeugt und
schaue nach, wann das erste Duplikat erscheint.
Post by Peter Götz
Post by D. Gottschaldt
Oder auch, wenn Datensätze des eigenen Programms mit Datensätzen von
Fremdsystemen gemischt werden müssen, was zumindest bei meinen Projekten
fast ausschließlich der Fall ist. Da würde es nicht unbedingt Sinn
machen, zwei Arten von IDs zu pflegen.
Siehe oben: Wenn die Fremdformate bekannt sind, gibt es vieles zu
überlegen, nicht nur das Format alleine. Ist es nicht bekannt, ist jede
Überlegung vorher müßig.
Klar. Soviel Selbsterhaltungstrieb sollte jeder haben, um sich diese
Gedanken schon bei den ersten Projektbesprechungen zu machen; bzw. schon bei
der allerersten Analyse.
Post by Peter Götz
Post by D. Gottschaldt
Ja, natürlich kann es zu Duplikaten kommen, aber wie gesagt: betrachte
mal selbst die Wahrscheinlichkeit und die relativ einfachen
Möglichkeiten, das abzufangen.
Mit welchen Kosten abfangen? Jedesmal erst prüfen, ob ein vergebener Index
bereits vergeben ist, oder fehlschlagende Einfügeversuche abfangen? Beides
ziemlich hohe Kosten, finde ich.
Finde ich nicht, denn bei einem ausreichend großen Bereich kommen
fehlgeschlagene Einfügeversuche kaum vor.
Selbst bei einem oder zwei am Tag wären die Kosten minimal, d. h. der
zusätzliche Zeitaufwand für den Einfügeversuch bewegt sich im
Zehntelsekundenbreich und die Alternativfunktion wird ja nur im Fehlerfall
aufgerufen. Aber wie gesagt: das kam in meinem System in 4 Jahren im
Regelbetrieb genau einmal vor. Insofern also hinnehmbar.
Post by Peter Götz
Post by D. Gottschaldt
Im übrigen mal einen herzlichen Dank an Dich und die anderen
Newsgroup-Cracks hier; als ich vor ca. 8 Jahren durch einen ziemlich
blöden Zufall meinen anständigen Beruf als Dipl.-Betriebswirt aufgab und
in die "Niederungen" der Softwareentwicklung hinabstieg, waren es Deine
Seiten, Beiträge (wie auch die von H. M. Genauck, E. Boye und diversen
anderen Ungenannten), die es mir ermöglicht haben, mich in die Geschichte
einzuarbeiten und Unmengen von Fehlern zu vermeiden.
Danke, das ist nett, das auch mal zu hören...
;-)
Ich habe zu danken.

Gruß

Dragan Gottschaldt
Post by Peter Götz
Viele Grüße
Harald M. Genauck
ABOUT Visual Basic - das Webmagazin - http://www.aboutvb.de
"visual studio one" - http://www.visualstudio1.de
Harald M. Genauck
2006-09-26 21:49:23 UTC
Permalink
Hallo Dragan,
Post by D. Gottschaldt
Post by Harald M. Genauck
Post by D. Gottschaldt
OK, grundsätzlich magst Du ja recht haben, aber man muß akzeptieren, daß
es ab und zu mal Anforderungen abseits der reinen Lehre gibt, die es
notwendig machen, eine nicht optimale Lösung zu wählen. So z. B. bei den
im Eingangspost beschriebenen Beispiel. Aus Deiner eigenen Erfahrung
wirst Du bestimmt auch Pflichtenhefte kennen, bei denen man sich an den
Kopf greifen muß, den Kunden aber schlichtweg nicht von der
Unsinnigkeit
einer solchen Vorgehensweise überzeugen kann, selbst wenn man mit einer
mehrköpfigen Beratermannschaft aufläuft.
Mir ist sowas in der Art auch schon des öfteren begegnet. Meistens blieb es
dabei nicht bei einem einzigen derartigen Klops, so dass ich denn auch
meistens solche Aufträge gar nicht erst weiter- bzw. ausgeführt habe - mit
solchen Kunden gibt es in der Regel im Projektverlauf zu viel Ärger.
Klar, ist manchmal auch sinnvoller, aber andererseits bin ich so dermaßen
käuflich :-)
Im Ernst: bei Aufträgen im 6- oder zumindest mitleren 5-stelligen Bereich
(leider nicht an der Tagesordnung) überlegt man sich schon sehr genau, ob
man dem Kunden dann eben nicht seinen Willen läßt. Es läßt sich ja
schriftlich fixieren, was man rät und welche Lösung der Kunde
letztendlich durchsetzt - mit den Konsequenzen, die sich daraus ergeben.
Siehe es mal positiv: damit generiert der Kunde selbst für Leute wie uns
Folgeaufträge, indem er uns später Sachen korrigieren läßt, vor denen man
ihn vorher schon ehrlicherweise gewarnt hat.
Auch mit der Hoffnung darauf bin ich schon auf die Nase gefallen - mir
reicht's...

Der Versuch, den Aufwand für eine vom Kunden selber verschuldete Korrektur
nachweisen zu wollen und hieb- und stichfest von evtl. eigenen Fehlern oder
Versäumnissen abzugrenzen, kann böse ins Auge gehen.

Nee danke, beratungsresistente Kunden sind mir die Nerven nicht wert,
zumindest nicht mehr auf meine alten Tage...
;-)
Post by D. Gottschaldt
Post by Harald M. Genauck
Sollte aber ein anderes System ein spezifisches ID-Format erwarten, ist
dieses entweder bekannt, so dass man tatsächlich einen dafür passenden
Generator bauen kann (und evtl. muss, falls das importierende System kein
API dafür anbietet). Oder mögliche Formate sind noch nicht
vorausschaubar -
aber dann kann jede Wahl eines Formats später genau die falsche gewesen
sein.
Eben. Und meine Funktion ist halt nichts anderes als ein solchen
ID-Generator. Nicht elegant, aber sie hat bisher ihren Zweck erfüllt.
Wegen diverser Gründe mache ich Anbindungen von Fremdsystemen fast
ausschließlich über die Datenbank und seltenst über bereitgestellte
Schnittstellen. Gerade das ist bei vielen der Knackpunkt: Für die Zwecke,
die zumindest meine Kunden benötigen, reichen die von den Herstellern
bereitgestellten APIs und Schnittstellen nicht aus.
Wie gesagt - funktioniert nur, wenn Du voraussehen kannst, welchen ID-Typ
Du von Anfang an wählen musst, um später kompatibel zu sein. Andererseits
kann es ja auch vorkommen, dass zu zwei verschiedenen anderen Systemen
exportiert werden muss, deren ID-Typen aber zueinander inkompatibel sind.
Was dann? Dann wird Dir sowieso nichts anderes übrigbleiben, als mit
ID-Mappings-Tabellen zu arbeiten. Wenn Du aber erst einmal an dem Punkt
bist, ist es auch egal, welchen Typ Deine "heimische" ID hat. Daher ist und
bleibt, wenn man die freie Wahl hat, ein GUID die allererste und
zuverlässigste Wahl für eine eindeutige ID.
Post by D. Gottschaldt
Post by Harald M. Genauck
Zufahrlässigkeit
Zufall-Lässigkeit
;-)
Klar, aber mach mal eine Schleife, die IDs aus meiner Funktion erzeugt
und schaue nach, wann das erste Duplikat erscheint.
Jo, wie de Kölsche sääd: Et hätt no emme joot jejange..
;-)

Im Ernst: Für den Heim- und Hobby-Bedarf kann das ja vielleicht noch
angehen. Aber die Parts Deiner Funktion, die auf dem Zufallszahlengenerator
beruhen, würden locker durch jedes einigermaßen Ernst gemeinte
Qualitätsaudit rasseln.
Post by D. Gottschaldt
Post by Harald M. Genauck
Post by D. Gottschaldt
Ja, natürlich kann es zu Duplikaten kommen, aber wie gesagt: betrachte
mal selbst die Wahrscheinlichkeit und die relativ einfachen
Möglichkeiten, das abzufangen.
Mit welchen Kosten abfangen? Jedesmal erst prüfen, ob ein vergebener Index
bereits vergeben ist, oder fehlschlagende Einfügeversuche abfangen? Beides
ziemlich hohe Kosten, finde ich.
Finde ich nicht, denn bei einem ausreichend großen Bereich kommen
fehlgeschlagene Einfügeversuche kaum vor.
Selbst bei einem oder zwei am Tag wären die Kosten minimal, d. h. der
zusätzliche Zeitaufwand für den Einfügeversuch bewegt sich im
Zehntelsekundenbreich und die Alternativfunktion wird ja nur im
Fehlerfall aufgerufen. Aber wie gesagt: das kam in meinem System in 4
Jahren im Regelbetrieb genau einmal vor. Insofern also hinnehmbar.
Die Kosten können durchaus erheblich höher sein. Etwa, wenn die
fehlschlagende Speicherung im Rahmen einer komplexeren Transaktion
aufläuft. Durch fahrlässige Programmierung mutwillig hervorgerufene
Rollbacks sind derart was von unerwünscht... Und die höheren Kosten brauch
auch u.U. nicht nur allein aus dem Rollback-Aufwand resultieren - an einer
fehlgeschlagenen Transaktion kann vieles andere hängen, bin hin zur
Involvierung einer manuellen Inspektion durch einen Administrator oder gar
bis hin zum Auslösen von Security-Alerts... je nach dem... Ok - letzteres
ist ein wenig dick aufgetragen, aber durchaus bedenkenswert bei dem
Entschluss, auf fahrlässigen Code zu setzen und zu verkaufen...


Viele Grüße

Harald M. Genauck

ABOUT Visual Basic - das Webmagazin - http://www.aboutvb.de
"visual studio one" - http://www.visualstudio1.de
Peter Fleischer
2006-09-27 05:22:19 UTC
Permalink
D. Gottschaldt wrote:
...
Post by D. Gottschaldt
Post by Harald M. Genauck
Sollte aber ein anderes System ein spezifisches ID-Format erwarten,
ist dieses entweder bekannt, so dass man tatsächlich einen dafür
passenden Generator bauen kann (und evtl. muss, falls das
importierende System kein API dafür anbietet). Oder mögliche Formate
sind noch nicht vorausschaubar -
aber dann kann jede Wahl eines Formats später genau die falsche
gewesen sein.
Eben. Und meine Funktion ist halt nichts anderes als ein solchen
ID-Generator. Nicht elegant, aber sie hat bisher ihren Zweck erfüllt.
Wegen diverser Gründe mache ich Anbindungen von Fremdsystemen fast
ausschließlich über die Datenbank und seltenst über bereitgestellte
Schnittstellen. Gerade das ist bei vielen der Knackpunkt: Für die
Zwecke, die zumindest meine Kunden benötigen, reichen die von den
Herstellern bereitgestellten APIs und Schnittstellen nicht aus.
...

Ist das nicht ein Widerspruch? Die bereitgestellten Verfahren reichen nicht
aus, deines reicht?

Ich kenne die Argumentationen der Kunden zur Genüge: "Das haben wir schon
immer so gemacht und es hat funktioniert", "Unsere sprechenden Schlüssel
haben sich bewährt", "Die Mitarbeiter können aus dem Schlüssel sofort
erkennen, dass ...", "Wir können nicht alle alten System umstellen", "Mit
solchen riesigen Monstern von neuen Schlüsseln kann keiner umgehen" und zum
Schluss "Sie sind der Projektant und sollten eigentlich in der Lage sein,
das Problem in unserem Interesse zu lösen - wofür bezahlen wir sie denn
sonst".

Ich kann dir nur empfehlen, auf GUID's umzusteigen. Für die Kopplung mit
alten Systemen, die keine zusätzliche GUID-Spalte haben bzw. zulassen, kann
man eine "Übersetzungstabelle" mitführen. Mit solcher Lösung ist man für die
Zukunft besser gewappnet, als mit eigenen ID-Generatoren. Die GUID braucht
ja niemand zu sehen.

Peter
curtis m. west
2006-10-01 04:48:14 UTC
Permalink
Post by Peter Götz
Dazu brauchst Du in der Tat nicht unbedingt GUIDs. Auch wenn Du einige
zigtausend verschiedene Artikel verwalten willst/musst, würde da schon
simple Nummern (Typ Integer) genügen.
Wenn Du, wie zu vermuten ist, Deine Artikel in einer Datenbanktabelle
speicherst, kannst Du bei der Neuanlage eines Artikels im einfachsten
Fall mit Autowerten für die Artikelnummer (ID) arbeiten oder wenn Du
ack
Post by Peter Götz
das aus irgendwelchen Gründen nicht willst, ist es relativ einfach mit
einem entsprechenden SQL-Statement die bisher höchste oder anderweitig
noch freie Nummer zu ermitteln und dann entweder die nächste freie oder
eben nächsthöhere Nummer für einen neuen Artikeldatensatz zu verwenden.
Hier muss jedoch noch darauf geachtet werden, dass die Einfügeoperationen
dann serialisiert sind, sonst könnte folgendes geschehen:
- Prozess A checkt die bisher höchste Nummer und bekommt 27
- Prozess B checkt die bisher höchste Nummer und bekommt ebenfalls 27
- Prozess A schreibt den Datensatz mit Nummer 27+1 = 28
- Prozess B schreibt den Datensatz mit Nummer 27+1 = 28, was natürlich
Fehlschlägt (wenn die Spalte keine Dupes erlaubt) oder andernfalls zu
inkonsistenten Daten führt.

Behaftet mich bitte nicht darauf, aber ich denke, nur wenn die Applikation
nur auf einem Rechner läuft, dann ist die Chance wirklich 0 (wenn ich das
mit den GUIDs richig verstanden habe) ansonsten müsste man, wenn man es auf
die Spitze treiben will, auch berücksichtigen, dass selbst GUIDs nicht
100%is eindeutig sind! Also müsste dieser Fall trotzdem gehandelt werden,
auch wenn die Chance, dass er eintritt sehr nah bei 0 ist... ;-)

Dazu auch Auszug aus MSDN: Ein GUID (Globally Unique Identifier) ist eine
128-Bit-Zahl, die durch den erzeugenden Algorithmus mit an Sicherheit
grenzender Wahrscheinlichkeit eindeutig ist.
Peter Fleischer
2006-10-01 05:37:02 UTC
Permalink
curtis m. west wrote:
...
Post by curtis m. west
Hier muss jedoch noch darauf geachtet werden, dass die
Einfügeoperationen dann serialisiert sind, sonst könnte folgendes
geschehen: - Prozess A checkt die bisher höchste Nummer und bekommt 27
Dieses "checkt die bisher höchste Nummer" ist in einer Mehrnutzerumgebung
ein unzulässiger Weg, außer, dieses "checkt ..." führt der Datenbankserver
aus und blockiert die vergebenen Nummern bis zur Freigabe bzw. bis zur
nächsten Anfrage vom gleichen Programm/Anwender.

...
Post by curtis m. west
Behaftet mich bitte nicht darauf, aber ich denke, nur wenn die
Applikation nur auf einem Rechner läuft, dann ist die Chance wirklich
0 (wenn ich das mit den GUIDs richig verstanden habe) ansonsten
müsste man, wenn man es auf die Spitze treiben will, auch
berücksichtigen, dass selbst GUIDs nicht 100%is eindeutig sind! Also
müsste dieser Fall trotzdem gehandelt werden, auch wenn die Chance,
dass er eintritt sehr nah bei 0 ist... ;-)
...

Ein Programm ohne Fehlerbehandlung ist wie Auto fahren ohne Lenkung :-) Es
kann ja auch mal die Verbindung zur Datenbank unterbrochen sein und schon
liegt ein zu behandelnder Fehlerzustand vor.

Peter
Karsten Sosna
2006-10-01 06:28:51 UTC
Permalink
Post by curtis m. west
Hier muss jedoch noch darauf geachtet werden, dass die Einfügeoperationen
- Prozess A checkt die bisher höchste Nummer und bekommt 27
- Prozess B checkt die bisher höchste Nummer und bekommt ebenfalls 27
- Prozess A schreibt den Datensatz mit Nummer 27+1 = 28
- Prozess B schreibt den Datensatz mit Nummer 27+1 = 28, was natürlich
Fehlschlägt (wenn die Spalte keine Dupes erlaubt) oder andernfalls zu
inkonsistenten Daten führt.
Hallo Curtis,
logisch, oder?
Post by curtis m. west
Behaftet mich bitte nicht darauf, aber ich denke, nur wenn die Applikation
nur auf einem Rechner läuft, dann ist die Chance wirklich 0 (wenn ich das
mit den GUIDs richig verstanden habe)
Siehe unten.
Post by curtis m. west
ansonsten müsste man, wenn man es auf die Spitze treiben will, auch
berücksichtigen, dass selbst GUIDs nicht 100%is eindeutig sind! Also
müsste dieser Fall trotzdem gehandelt werden, auch wenn die Chance, dass
er eintritt sehr nah bei 0 ist... ;-)
Richtig.
Post by curtis m. west
Dazu auch Auszug aus MSDN: Ein GUID (Globally Unique Identifier) ist eine
128-Bit-Zahl, die durch den erzeugenden Algorithmus mit an Sicherheit
grenzender Wahrscheinlichkeit eindeutig ist.
Wobei man bei der Wahrscheinlichkeit davon ausgeht, das ein und der selbe
Rechner 100 Jahre lang jede Sekunde eine GUID erzeugen könnte ohne das eine
doppelte GUID erzeugt wird. Aber auch hier gilt Murphys-Gesetz "50.000 Leute
im Stadion, ich in der Westkurve, ein Ball geht in die Tribüne. Wer bekommt
den Ball an Kopf?". ;=)
Also immer schön abfangen, dann klappt es eigentlich auch, auch wenn man mit
mehreren Rechnern im Netz arbeitet.
--
Gruß Scotty
Harald M. Genauck
2006-10-01 10:31:49 UTC
Permalink
Hallo Curtis, Scotty,
Post by Karsten Sosna
Post by curtis m. west
ansonsten müsste man, wenn man es auf die Spitze treiben will, auch
berücksichtigen, dass selbst GUIDs nicht 100%is eindeutig sind! Also
müsste dieser Fall trotzdem gehandelt werden, auch wenn die Chance, dass
er eintritt sehr nah bei 0 ist... ;-)
Richtig.
Post by curtis m. west
Dazu auch Auszug aus MSDN: Ein GUID (Globally Unique Identifier) ist
eine 128-Bit-Zahl, die durch den erzeugenden Algorithmus mit an
Sicherheit grenzender Wahrscheinlichkeit eindeutig ist.
Wobei man bei der Wahrscheinlichkeit davon ausgeht, das ein und der selbe
Rechner 100 Jahre lang jede Sekunde eine GUID erzeugen könnte ohne das
eine doppelte GUID erzeugt wird. Aber auch hier gilt Murphys-Gesetz
"50.000 Leute im Stadion, ich in der Westkurve, ein Ball geht in die
Tribüne. Wer bekommt den Ball an Kopf?". ;=)
Also immer schön abfangen, dann klappt es eigentlich auch, auch wenn man
mit mehreren Rechnern im Netz arbeitet.
Prinzipiell abfangen, klar, wie auch Peter schon sagte...

Aber ich denke, bei GUIDs braucht man sich wirklich keine weiteren Gedanken
über die Zuverlässigkleit der Eindeutigkeit zu machen. Zu viele, große,
namhafte Unternehmen haben die Infrastrukturen ihrer Produkte davon
abhängig gemacht, als dass sie auf etwas setzen würden, das in einem
komplexen, weltweit gültigen Szenario unzuverlässig wäre. Schließlich gibt
es keinen Algorithmus, der erkennen könnte, ob zwei aus verschiedenen
Quellen kommende gleiche GUIDS dasselbe oder etwas anderes bedeuten
sollen - da ist auch nichts abzufangen.

Viele Grüße

Harald M. Genauck

ABOUT Visual Basic - das Webmagazin - http://www.aboutvb.de
"visual studio one" - http://www.visualstudio1.de
Karsten Sosna
2006-10-02 03:57:23 UTC
Permalink
Post by Harald M. Genauck
Aber ich denke, bei GUIDs braucht man sich wirklich keine weiteren
Gedanken über die Zuverlässigkleit der Eindeutigkeit zu machen. Zu viele,
große, namhafte Unternehmen haben die Infrastrukturen ihrer Produkte davon
abhängig gemacht, als dass sie auf etwas setzen würden, das in einem
komplexen, weltweit gültigen Szenario unzuverlässig wäre. Schließlich gibt
es keinen Algorithmus, der erkennen könnte, ob zwei aus verschiedenen
Quellen kommende gleiche GUIDS dasselbe oder etwas anderes bedeuten
sollen - da ist auch nichts abzufangen.
Hallo Harald,
das Problem wirst Du immer haben, ob Du mit GUIDs oder bspw. lfd. Nummern
arbeitest. Dazu brauchst Du auch nicht extra 2 Quellen, dazu reichen 2
Tabellen in einer DB die nichts miteinander zutun haben. Aber grundsätzlich
ist das Konsulidieren zweier Datenquellen auch nicht das Problem, solange
man sich merkt ob es sich um vorhandene Daten handelt oder um neue. Welche
Komplikationen es beim Zusammenführen gibt, sollte jedem bewusst sein, der
sich mit der Thematik schon mal auseinander gesetzt hat. Denke hier nur an
eine Verbrauchszählung.
Sicherlich ist das Leben mit GUIDs einfacher, deswegen verstehe ich auch
nicht warum darüber diskutiert, ob man das nicht kürzer machen
könnte(vielleicht nur 10 Stellen). Ich glaube angesichts der Tatsache, das
ein GUID 33 signifikante Stellen und damit 16^33, ca. 2.544sextilliarden
(10^39) Möglichkeiten, mache ich mir da zumindest keine große Gedanken, ob
ich mit dem Bereich hinkomme und wieviel Platz dafür in der Tabelle benötigt
wird.
--
Gruß Scotty
Harald M. Genauck
2006-10-02 11:11:30 UTC
Permalink
Halo Scotty,
Post by Karsten Sosna
Post by Harald M. Genauck
Aber ich denke, bei GUIDs braucht man sich wirklich keine weiteren
Gedanken über die Zuverlässigkleit der Eindeutigkeit zu machen. Zu
viele, große, namhafte Unternehmen haben die Infrastrukturen ihrer
Produkte davon abhängig gemacht, als dass sie auf etwas setzen würden,
das in einem komplexen, weltweit gültigen Szenario unzuverlässig wäre.
Schließlich gibt es keinen Algorithmus, der erkennen könnte, ob zwei aus
verschiedenen Quellen kommende gleiche GUIDS dasselbe oder etwas anderes
bedeuten sollen - da ist auch nichts abzufangen.
das Problem wirst Du immer haben, ob Du mit GUIDs oder bspw. lfd. Nummern
arbeitest. Dazu brauchst Du auch nicht extra 2 Quellen, dazu reichen 2
Tabellen in einer DB die nichts miteinander zutun haben.
So weit ich das verstanden habe, können zumindest auf ein und demselben
Rechner _nie_ zwei gleiche GUIDs erzeugt werden.
Post by Karsten Sosna
Sicherlich ist das Leben mit GUIDs einfacher, deswegen verstehe ich auch
nicht warum darüber diskutiert, ob man das nicht kürzer machen
könnte(vielleicht nur 10 Stellen). Ich glaube angesichts der Tatsache,
das ein GUID 33 signifikante Stellen und damit 16^33, ca.
2.544sextilliarden (10^39) Möglichkeiten, mache ich mir da zumindest
keine große Gedanken, ob ich mit dem Bereich hinkomme und wieviel Platz
dafür in der Tabelle benötigt wird.
Das sehe ich exakt genau so.

Viele Grüße

Harald M. Genauck

ABOUT Visual Basic - das Webmagazin - http://www.aboutvb.de
"visual studio one" - http://www.visualstudio1.de
Karsten Sosna
2006-10-02 16:27:49 UTC
Permalink
Post by Harald M. Genauck
Post by Karsten Sosna
das Problem wirst Du immer haben, ob Du mit GUIDs oder bspw. lfd. Nummern
arbeitest. Dazu brauchst Du auch nicht extra 2 Quellen, dazu reichen 2
Tabellen in einer DB die nichts miteinander zutun haben.
So weit ich das verstanden habe, können zumindest auf ein und demselben
Rechner _nie_ zwei gleiche GUIDs erzeugt werden.
Hallo Harald,
was würdest Du als erstest als Zufallskriterium für ein Zufallszahl nehmen?
Die Zeit. Und die ist nach Albert Einstein relativ. Lese mal die
2.Relalivitätstheorie und Du weist warum.
Post by Harald M. Genauck
Post by Karsten Sosna
Sicherlich ist das Leben mit GUIDs einfacher, deswegen verstehe ich auch
nicht warum darüber diskutiert, ob man das nicht kürzer machen
könnte(vielleicht nur 10 Stellen). Ich glaube angesichts der Tatsache,
das ein GUID 33 signifikante Stellen und damit 16^33, ca.
2.544sextilliarden (10^39) Möglichkeiten, mache ich mir da zumindest
keine große Gedanken, ob ich mit dem Bereich hinkomme und wieviel Platz
dafür in der Tabelle benötigt wird.
Das sehe ich exakt genau so.
Dann sind wir uns ja einig. ;=)
--
Gruß Scotty
Harald M. Genauck
2006-10-02 17:00:38 UTC
Permalink
Hallo Karsten,
Post by D. Gottschaldt
Post by Harald M. Genauck
Post by Karsten Sosna
das Problem wirst Du immer haben, ob Du mit GUIDs oder bspw. lfd.
Nummern arbeitest. Dazu brauchst Du auch nicht extra 2 Quellen, dazu
reichen 2 Tabellen in einer DB die nichts miteinander zutun haben.
So weit ich das verstanden habe, können zumindest auf ein und demselben
Rechner _nie_ zwei gleiche GUIDs erzeugt werden.
Hallo Harald,
was würdest Du als erstest als Zufallskriterium für ein Zufallszahl
nehmen? Die Zeit. Und die ist nach Albert Einstein relativ. Lese mal die
2.Relalivitätstheorie und Du weist warum.
Da aber die Zeit nur ein Kriterium bei der GUID-Erzeugung ist, relativiert
sich das wieder. Und außerdem hätte ein Rechner in sich den gleichen
relativen Zeitbezug.
;-)


Viele Grüße

Harald M. Genauck

ABOUT Visual Basic - das Webmagazin - http://www.aboutvb.de
"visual studio one" - http://www.visualstudio1.de
curtis m. west
2006-10-03 08:11:01 UTC
Permalink
Post by Harald M. Genauck
Post by D. Gottschaldt
Hallo Harald,
was würdest Du als erstest als Zufallskriterium für ein Zufallszahl
nehmen? Die Zeit. Und die ist nach Albert Einstein relativ. Lese mal die
2.Relalivitätstheorie und Du weist warum.
Da aber die Zeit nur ein Kriterium bei der GUID-Erzeugung ist, relativiert
sich das wieder. Und außerdem hätte ein Rechner in sich den gleichen
relativen Zeitbezug.
;-)
Bist du dir dessen relativ sicher? ;-)
Zudem: Was, wenn der Rechner mit c durch den Raum bewegt wird? Sind wir dann
immer noch sicher vor Doubletten? ;-)
*scnr*
Harald M. Genauck
2006-10-03 12:36:59 UTC
Permalink
Hallo Curtis,
Post by curtis m. west
Post by Harald M. Genauck
Post by Karsten Sosna
was würdest Du als erstest als Zufallskriterium für ein Zufallszahl
nehmen? Die Zeit. Und die ist nach Albert Einstein relativ. Lese mal
die 2.Relalivitätstheorie und Du weist warum.
Da aber die Zeit nur ein Kriterium bei der GUID-Erzeugung ist,
relativiert sich das wieder. Und außerdem hätte ein Rechner in sich den
gleichen relativen Zeitbezug.
Bist du dir dessen relativ sicher? ;-)
Zudem: Was, wenn der Rechner mit c durch den Raum bewegt wird? Sind wir
dann immer noch sicher vor Doubletten? ;-)
Aber ja doch: Von einem solchen Rechner erzeugte GUIDs würden uns ja nicht
erreichen, also auch nicht in die Quere kommen können...
;-)


Viele Grüße

Harald M. Genauck

ABOUT Visual Basic - das Webmagazin - http://www.aboutvb.de
"visual studio one" - http://www.visualstudio1.de

Peter Götz
2006-10-02 16:28:02 UTC
Permalink
Hallo curtis m.
Post by curtis m. west
Post by Peter Götz
das aus irgendwelchen Gründen nicht willst, ist es relativ einfach mit
einem entsprechenden SQL-Statement die bisher höchste oder
anderweitig
Post by curtis m. west
Post by Peter Götz
noch freie Nummer zu ermitteln und dann entweder die nächste freie oder
eben nächsthöhere Nummer für einen neuen Artikeldatensatz zu verwenden.
Hier muss jedoch noch darauf geachtet werden, dass die
Einfügeoperationen
Post by curtis m. west
- Prozess A checkt die bisher höchste Nummer und bekommt 27
- Prozess B checkt die bisher höchste Nummer und bekommt ebenfalls 27
- Prozess A schreibt den Datensatz mit Nummer 27+1 = 28
- Prozess B schreibt den Datensatz mit Nummer 27+1 = 28, was
natürlich
Post by curtis m. west
Fehlschlägt (wenn die Spalte keine Dupes erlaubt) oder andernfalls zu
inkonsistenten Daten führt.
Und was bedeutet in diesem Falle "fehlschlagen"?
Es wird schlicht und einfach ein Fehler ausgelöst, den eine hoffentlich
vorhandene Fehlererkennung feststellt, dann die ID ein weiteres mal um
1 erhöht und einen erneuten Speicherversuch startet.

Ein ganz simpler Vorgang, der dann keineswegs zu inkonsistenten Daten
führt.
Post by curtis m. west
Behaftet mich bitte nicht darauf, aber ich denke, nur wenn die
Applikation
Post by curtis m. west
nur auf einem Rechner läuft, dann ist die Chance wirklich 0
Was meinst Du mit "ist die Chance wirklich 0"?
Post by curtis m. west
(wenn ich das
mit den GUIDs richig verstanden habe) ansonsten müsste man, wenn man es auf
die Spitze treiben will, auch berücksichtigen, dass selbst GUIDs nicht
100%is eindeutig sind! Also müsste dieser Fall trotzdem gehandelt werden,
auch wenn die Chance, dass er eintritt sehr nah bei 0 ist... ;-)
Na ja, Du wirst ja wohl nicht unbedingt ein Datenbankprogramm ohne
jegliche Fehlerbehandlung schreiben wollen? Das wäre etwa so wie
Autofahren ohne Bremsen und ohne Lenkrad.
Post by curtis m. west
Dazu auch Auszug aus MSDN: Ein GUID (Globally Unique Identifier) ist eine
128-Bit-Zahl, die durch den erzeugenden Algorithmus mit an Sicherheit
grenzender Wahrscheinlichkeit eindeutig ist.
So isses...
und das verbleibende Restrisiko wird durch eine ohnehin erforderliche
Fehlererkennung/Fehlerbehandlung unschädlich gemacht.

Gruß aus St.Georgen
Peter Götz
www.gssg.de (mit VB-Tipps u. Beispielprogrammen)
Malte Klena
2006-09-26 10:05:58 UTC
Permalink
Hallo Andreas,
Post by Andreas Kammann
Hi, danke euch. Ich benötige die ID um einen Artikel Datensatz zu
kennzeichnen (GruppenID)
Ich weiß auch nicht ob die Idee die ich so habe richtig ist. Aber die Sachen
von Herrn Gottschald sind ganz gut.
abgesehen davon, daß ich selbst GUIDs oder Autowerte der DB immer bevorzugen
würde:

Falls du davon ausgehen kannst, daß es in deiner Anwendung nicht vorkommen
kann, daß mehrere IDs simultan erzeugt werden, kannst du eine Art Timestamp
benutzen.

Im einfachsten Fall:
dim id as Long = DateTime.Now.Ticks


Gruß
Malte
Daniel Bloch
2006-09-26 11:00:27 UTC
Permalink
Warum eigentlich keine GUID, wenn sie doch im vb.net so einfach zu
erstellen ist:

Dim myGuid As Guid = Guid.NewGuid

Das wär ja schon alles ;)

Daniel
Loading...