AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

GUID als Index?

Ein Thema von Sharky · begonnen am 9. Mär 2004 · letzter Beitrag vom 9. Mär 2004
Antwort Antwort
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#1

GUID als Index?

  Alt 9. Mär 2004, 08:44
Hai,

ich schreibe gerade an einem kleinen Programm. Dieses besteht aus einer lokalen DB und einem DB-Server.

Neue Daten werden immer lokal erfasst. Über eine Exportfunktion können die neuen Daten nun zum Server übertragen werden und über einen Import können die Einträge der anderen Benutzer in die lokale Datenbank eingetragen werden.

Jetzt stellt sich mir die Frage wie ich am besten die IDs vergebe. Einfach hochzählen geht ja nicht. Dann habe ich ja doppelte IDs.

Mir sind bis jetzt zwei Methoden eingefallen.

a) - Als ID wird eine GUID verwendet
b) - Ich erzeuge die ID aus der Benutzernummer und einem Hochgezähltenwert. z.B:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
 gesamt_id : INT64;
 datensatz_id,
 user_id : LongInt;
begin
  user_id := 10000;
  datensatz_id := 4;
  gesamt_id := (user_id SHL 16) + datensatz_id;
  Edit1.Text := IntToStr (gesamt_id); // Das ist die gesamt ID
  Label1.Caption := IntToStr (gesamt_id SHR 16); // Herausrechnen der user_id
  Label2.Caption := IntToStr (gesamt_id AND $FFFF); // Herausrechnen der datensatz_id
end;
Was ist nun der beste Weg?
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Mario

Registriert seit: 7. Apr 2003
567 Beiträge
 
Delphi 2006 Enterprise
 
#2

Re: GUID als Index?

  Alt 9. Mär 2004, 09:05
Der Weg mit dem hinzuzählen von einer Benutzernummer finde ich unglücklich. Was ist, wenn es im Laufe der Zeit mal mehr Benutzer gibt? Dann steht Dein Konzept in einer Sackgasse...

Weg 2 mit der GUID ist nicht schlecht.

Als Weg 3 würde ich Nummernkreise vorschlagen. Beim Anmelden bekommt Deine App einen Nummerkreis von sagen wir mal tausend Nummern vom Server zugeteilt. Wenn die weg sind, werden die nächsten geholt.
Schöne Grüße,
Mario Noack
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#3

Re: GUID als Index?

  Alt 9. Mär 2004, 09:11
Hallo Sharky,
ich würde es folgendermaßen probieren:

- Lokal eine ID verwenden. Beim IB würde ich hier einen Generator nutzen.
- Wenn die lokalen Daten auf den Server geschoben werden darf die lokale ID
nicht mit gegeben werden. Auf dem Server erhalten die Datensätze dann eine neue ID.
Da der Server die ID's vergibt kommt es auch nicht zu doppelten ID's

Wenn die lokalen Daten auf den Server gespielt wurden können diese ja lokal gelöscht werden.
Weil -> die Daten sind ja erfasst. Deshalb gibt es auch keine weiteren Probleme mit den ID's

Wenn der Client sich jetzt die Daten wieder vom Server holt arbeitet er eben mit den ID's vom Server.

Jetzt könnte der Fall eintreten, dass der Client Daten vom Server geholt hat. Diese Daten werden verändert und neue Daten werden erfasst. Jetzt muss bei den geänderten Daten die ID verwendet werden und bei den neuen Datensätze eben nicht.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#4

Re: GUID als Index?

  Alt 9. Mär 2004, 09:15
Hai Mario,

Zitat von Mario:
.... Was ist, wenn es im Laufe der Zeit mal mehr Benutzer gibt? Dann steht Dein Konzept in einer Sackgasse...
Das sollte bei einem 32Bit Bereich für die Benutzernummer nicht passieren.

Zitat:
Weg 2 mit der GUID ist nicht schlecht.
Ich denke ich werde in diesem Fall über die GUID gehen. Es werden nicht viele Einträge in der Datenbank sein. so das das Suchen über die GUID dein Problem sein wird.
Zitat:
Als Weg 3 würde ich Nummernkreise vorschlagen. Beim Anmelden bekommt Deine App einen Nummerkreis von sagen wir mal tausend Nummern vom Server zugeteilt. Wenn die weg sind, werden die nächsten geholt.
Auch eine gute Idee. Muss ich mir mal durch den Kopf gehen lassen.

Danke.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: Unterhaching
11.412 Beiträge
 
Delphi 12 Athens
 
#5

Re: GUID als Index?

  Alt 9. Mär 2004, 09:46
Zitat von Sharky:
Auch eine gute Idee. Muss ich mir mal durch den Kopf gehen lassen.
Ich denke mal, ich weiß was Du meinst und ich würde auch die Nummernkreise vorschlagen. 100er Gruppen reichen allemal.

......
Daniel Lizbeth
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#6

Re: GUID als Index?

  Alt 9. Mär 2004, 10:18
Zitat von sakura:
...Ich denke mal, ich weiß was Du meinst und ich würde auch die Nummernkreise vorschlagen. 100er Gruppen reichen allemal...
Die Katze meint zu wissen was ich mache?

Aber die Idee Mario ist gut und dürfte leicht zu realisieren sein. Ich brauche ja nur eine Tabelle die ein ID-Feld hat (autoInc) und ein Feld für die User-ID.

Wenn dort ein neuer Eintrag gemacht wird bekommt der User die ID*100 als neuen Bereich.

Code:
 ID   USER
  1    Sharky  <- Bereich 100-199
  2    Mario   <- Bereich 200-299
  3    Sakura  <- Bereich 300-399
  4    Sharky  <- Bereich 400-499
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
DelphiDeveloper

Registriert seit: 9. Apr 2003
Ort: Köln
256 Beiträge
 
Delphi XE2 Enterprise
 
#7

Re: GUID als Index?

  Alt 9. Mär 2004, 11:51
fuer deine ich nenne es mal "replikation on demand" sieht man in der tat oft guids als
ids vor. Ich hatte in meinem letzten Projekt sowas auf dem sql-server implementiert und da war die vorgabe meines auftraggebers guids zu verwenden. Auch zusammengesetzte PK's aus ID+MandantID hatte ich schon gesehen.

Bei Interbase oder Firebird wuerde ich das wie folgt realisieren. In der lokalen DB gibts in jeder Tabelle eine Mandant_id bei dem export auf den server wird dann im bevore insert trigger
folgendes gemacht.

sagen wir wir rechnen mit max 100 lokalen DBs

Code:
CREATE TRIGGER TEST_TABELLE_SERVER_BI FOR TEST_TABELLE_SERVER
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GEN_TEST_TABELLE_SERVER_ID,1) || (new.MANDANT_ID*100);
END
jetzt muesste das exportieren funktionieren. Die ID's sind sprechende bezeichner, denn
die id's mit der endung 200 kommen alle vom mandanten 2, die mit endung 9000 vom mandanten 90
usw. Dadurch kann man auch später noch erkennen von welchem mandant die Saetze angelegt wurden. Auch Masterdetail Relationen machen auf den lokalen DB's kein problem, die Reihenfolge beim export wirst du ja sicherlich bedenken.

Jetzt weiß ich nicht was du bei einem export alles machst:
EXPORT = neue lokale Daten exportieren , LOESCHEN und wieder importieren?

Bei dem import koennten daher noch probleme auftauchen.
Jenachdem wie deine export strategie ist. Es wäre auch denkbar die lokalen ID's
stets negativ zu vergeben, somit koennte man auch erkennen, dass diese nie
exportiert wurden.
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#8

Re: GUID als Index?

  Alt 9. Mär 2004, 12:00
Ich werde mir das mal bei einem Bier durch den Kopf gehen lassen

Die Variante mit den ID-Bereichen hat nämlich noch einen kleinen Nachteil! Der User kann das Programm ja auf mehreren Rechnern installiert haben. Dann reicht es nicht wenn ich die Bereiche pro User vergebe sondern ich muss sie pro User/Rechner vergeben.
Aber das wäre auch noch machbar.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  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 06:23 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