AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi global eindeutige ID
Thema durchsuchen
Ansicht
Themen-Optionen

global eindeutige ID

Ein Thema von stahli · begonnen am 31. Jul 2009 · letzter Beitrag vom 1. Aug 2009
Antwort Antwort
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#1

global eindeutige ID

  Alt 31. Jul 2009, 19:46
Datenbank: FB • Version: 2.1 • Zugriff über: IBX
Hallo alle,

ich möchte Datensätze aus meiner FB-Datenbank exportieren und diese auf diesem oder anderen Rechnern wieder importieren. Dabei sollen die Daten eine auf diesem Globus oder besser im Universum eindeutige "unverwechselbare" ID erhalten.

Ich habe jetzt dafür eine sheinbar praktikable Lösung gefunden und will bei Euch einmal nachfragen, was Ihr davon haltet...

In meinem Projekt geht es u.a. um Mannschaften und Spieler. Jede Mannschaft soll eine eindeutige ID erhalten und jeder Spieler natürlich auch.
Die Mannschaften mit den Spielern sollen (incl. ID) exportiert, verteilt und wieder irgendwo importiert werden können (dazu folgt später mal ein eigener Thread mit meinen Fragen zum Import/Export)).

Mein Lösungsansatz zu einer globalen ID (GID):
Es werden 2 Zeitstempel verwaltet und ein Generatorwert.
Zeitstempel 1 wird als MAINGID in einer Tabelle der Datenbank abgelegt, die nur einen Datensatz enthält.
Zeitstempel 2 ist in allen Tabellen als Feld GID enthalten, die über eine eindeutige ID verfügen müssen.
Der GIDGenerator ist ein normaler Generator.

MainGID und GID sind vom Typ D_GID.

Domain D_GID entspricht VARCHAR(50).

Für die Abfrage eines Zeitstempels wird folgende Prozedur benutzt:
Delphi-Quellcode:
ALTER PROCEDURE GET_GID_STAMP
RETURNS (
    GID VARCHAR(40))
AS
declare variable S varchar(40);
begin
  s = cast(current_timestamp as varchar(40));
  gid = substring(s from 1 for 4) ||
        substring(s from 6 for 2) ||
        substring(s from 9 for 2) ||
        substring(s from 12 for 2) ||
        substring(s from 15 for 2) ||
        substring(s from 18 for 2) ||
        substring(s from 21 for 4);
  suspend;
end^
Das Ergebnis sieht so aus: "200907311859118060"
MAINGID wird bei before_insert gesetzt sowie bei jedem Programmstart durch einen Prozeduraufruf innerhalb MainForm.OnCreate().
-> In MainGID steht also grundsätzlich die Programmstartzeit.


Die GID´s der einzelnen Tabellen werden später aus der MAINGID und der dann aktuellen Zeit zusammengesetzt, zusätzlich noch mit einem Generatorwert ergänzt und jeweils durch before_insert-Trigger zugewiesen:
Delphi-Quellcode:
ALTER PROCEDURE GET_GID
RETURNS (
    GID D_GID)
AS
declare variable GID1 D_GID;
declare variable GID2 D_GID;
declare variable GID3 varchar(10);
begin
  select gid from tournamentevent
    into :gid1;
  if (gid1 is null) then
  begin
    execute procedure setmaingid;
    select gid from tournamentevent
      into :gid1;
  end
  execute procedure get_gid_stamp
    returning_values(gid2);
  gid3 = cast(gen_id(gen_gid,1) as varchar(10));
  gid = gid1 || gid2 || gid3;
  suspend;
end^
Das Ergebnis sieht dann etwa so aus: "2009073118591180602009073119122234752"


Ich halte das für eine ID, die zumindest auf der Erde einmalig sein dürfte. Es müssten 2 Nutzer das Programm auf die 1000stel Sekunde gleichzeitig starten und auch einen Datensatz genau zum gleichen Zeitpunkt einfügen und bis dahin genau gleich viele Generator-Erhöhungen durchgeführt haben, damit eine gleiche ID vergeben wird.

Den Nachteil, dass die ID sehr lang ist, kann ich verschmerzen. Die Anzahl der betreffenden Datensätze hält sich bei mir in Grenzen. So bleibt aber auch bei einem späteren Datenaustausch jeder "Datensatz" eindeutig identifizierbar.

Evtl. könnte man überlegen, ob man den zweiten Zeitstempel auf einen "Unterschied zum ersten Zeitstempel" kürzt, aber ich denke, die paar Byte lohnen den Aufwand nicht.


Was haltet Ihr von der Lösung?
Gibt es bessere?
Das ist für mich noch etwas Neuland.


Eine Grundsätzliche Frage noch:
Damit die o.g. Lösung mit den Substrings funktioniert muss der TimeStamp-CAST immer im gleichen Format erfolgen. Offenbar macht dies FB unabhängig von den Ländereinstellungen immer gleich...
Kann ich aber evtl. auch ein Cast in einer bestimmten Form erzwingen (z.B. "YYYYMMDDHHNNSSTTTT")?


Stahli
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#2

Re: global eindeutige ID

  Alt 31. Jul 2009, 20:09
Eine ähnliche Lösung wäre eine GUID:

http://de.wikipedia.org/wiki/GUID

Vorteil: ist in Delphi direkt als Klasse eingebaut, Beispiel zur Verwendung: http://www.delphipraxis.net/internal...ct.php?p=69183

Und in Firebird 2.1:

Zitat:
Since Firebird 2.1 there is a built-in function GEN_UUID that creates a 128bit UUID. To retrieve it, you can use a statement like this one:

select GEN_UUID() from RDB$DATABASE;
http://www.firebirdfaq.org/faq98/

Würde man die Erdoberfläche in einzelne Quadrate mit je einem Quadratmillimeter Fläche einteilen, so könnte man jedem dieser Quadrate 667 Billiarden individuelle GUIDs zuteilen. Sie ist also sehr wahrscheinlich eindeutig ...
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#3

Re: global eindeutige ID

  Alt 31. Jul 2009, 20:47
Ich würde auch zur GUID raten.

Die kannst Du übrigens auch so erzeugen: www.get-a-guid.com
Disclaimer: Get-A-Guid.com wurde von Sakura und mir zusammen auf einer EKON Abends in der Hotelbar liebevoll in ca. einer Stunde hingerotzt und online gestellt.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#4

Re: global eindeutige ID

  Alt 31. Jul 2009, 20:55
Zitat von Phoenix:
Disclaimer: Get-A-Guid.com wurde von Sakura und mir zusammen auf einer EKON Abends in der Hotelbar liebevoll in ca. einer Stunde hingerotzt und online gestellt.
Super.
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: global eindeutige ID

  Alt 31. Jul 2009, 23:34
Ok danke, dann habe ich das Fahrrad nochmal erfunden

Ich hatte zwar schon einmal etwas von GUID gelesen, das aber bei meiner Suche nach einer Lösung nicht mehr richtig zugeordnet.

Schlechter scheint mir meine Lösung aber letztlich nicht zu sein (außer dass ein Feld und ein paar Prozeduren notwendig sind) und meine ID lässt eine aufsteigende Sortierung nach der Erzeugungsreienfolge zu, was wohl bei GUID nicht der Fall ist.

Was ist denn nun eigentlich neben einem Zeitstempel die hauptsächliche Ausgangsbasis für die GUI-Erzeugung? Eine Netzwerkadresse wird ja nicht mehr verwendet...

Stahli
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#6

Re: global eindeutige ID

  Alt 1. Aug 2009, 09:02
Im aktuellen Standard sind es wohl Zufallszahlen. Der UUID-Standard auf dem die GUID basiert wurde dahingehend mal geändert. Siehe auch: http://de.wikipedia.org/wiki/Univers...que_Identifier
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: global eindeutige ID

  Alt 1. Aug 2009, 09:18
Ich hatte das "Glück" schon mal. Eine OPC Komponente und das ActiveX für einen Industriedrucker welche wir im selben Projekt brauchten haben sich an einer Stelle ein und die selbe GUID geteilt. Mit dem Ergebnis, dass es ganz sonderbare Fehler gab die zunächst unerklärlich waren - es lief halt immer nur dann, wenn eins von beidem nicht eingebaut war. Wir haben die Kommunikation mit der SPS dann letztlich auf TCP umgebaut und ganz auf OPC verzichtet um das zu lösen.
Allerdings: Wir hattten den Source vom Drucker-ActiveX nicht, aber von dem OPC Kram. Und ein paar GUIDs sahen da verdächtig nach "von Hand" gewählt aus. Dennoch keine lustige Sache, da Windows wirklich blind von der Eindeutigkeit auszugehen scheint.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#8

Re: global eindeutige ID

  Alt 1. Aug 2009, 12:57
Zitat von Medium:
Dennoch keine lustige Sache, da Windows wirklich blind von der Eindeutigkeit auszugehen scheint.
Wir müssen nur alle immer für alles die gleiche GUID wählen und können somit Microsoft zum Sturz bringen
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz