Diskussion IBExpert, Firebird 2.5 und UUID als PK
Hallo zusammen,
das Problem vorab: IBExpert zeigt den Inhalt des UUID Feldes nicht an.
ich plane demnächst eine Anwendung die für mehrere Filialen gedacht ist.
Alle Filialen gleichen ihre Daten mit einer zentralen Datenbank ab.
Dabei unterscheiden sich die Datenbankstrukturen zwischen Filiale und Zentrale.
Somit muss ich wohl oder übel auf UUIDs für die PK Felder gehen. Auf dem ersten Blick könnte man meinen, eine zusammengesetzter PK
aus [FilialeID]+[Generator] würde reichen. Doch das tut es nicht da es vorkommen kann das ein Aussendienstler
eine Version kopiert und einem Kollegen zur Verfügung stellt. Dann hätte ich intern die gleiche FilialeID.
Also bleibt nur eine
GUID bzw. UUID.
Firebird 2.5 kann über GEN_UUID eine UUID im Trigger anlegen. Schon mal nicht schlecht dachte ich,
also gleich mal eine TestDB als UTF8 angelegt mit zwei Tabellen. Die eine mit Int als PK
und die andere mit char(16) octets als PK.
Danach die Tabellen mit IBExpert Testdatengenerator 1 Mio. Datensätze anlegen lassen.
Code:
CREATE DOMAIN S_UUID AS
CHAR(16) CHARACTER SET OCTETS
COLLATE OCTETS;
CREATE TABLE TESTTBL (
UUIDPK S_UUID NOT NULL /* S_UUID = CHAR(16) */,
NAME VARCHAR(50)
);
ALTER TABLE TESTTBL ADD CONSTRAINT PK_TESTTBL PRIMARY KEY (UUIDPK);
SET TERM ^ ;
CREATE OR ALTER TRIGGER TESTTBL_BI0 FOR TESTTBL
ACTIVE BEFORE INSERT POSITION 0
AS
begin
if (new.uuidpk is null) then
new.uuidpk = gen_uuid();
end
^
SET TERM ; ^
Die Int.PK Tabelle ist fertig in 7min.
Die UUID.PK Tabelle ist fertig in 20min.
OK, ein deutlicher unterschied aber irgendein Tod muss man sterben.
Meine Datenbank wird mehrere GB groß sein und mehrere Mio. Datensätze beinhalten, das ist bereits klar,
aber es werden nicht viele Datensätzen auf einmal in die
DB gepumpt. Deshalb kann ich den Performance-Verlust beim
massen inserts schon verkraften. Die eigentliche Performance beim Select, Update darf jedoch nicht leiden. Das ist wichtig!
Während der Entwicklungsphase werde ich sehr oft mit IBExpert die Datensätze suchen müssen. Da beginnt schon das erste
Problem. Die
DB ist in UTF8 angelegt und das UUID Feld ist ein char(16) character set octets somit sehe ich die UUID nicht. War es nicht angezeigt wird, ist schon klar. Aber ich brauche eine Möglichkeit während der Entwicklungsphase, Wenn das Programm fertig ist, ist es natürlich egal.
Möglicherweise gibt es eine Einstellung dafür. Ich habe keine Erfahrung mit UUIDs was könnt ihr darüber berichten. Was für
Probleme werden noch auf mich zukommen wenn ich nicht mit Int als PK arbeiten kann sondern mit UUIDs?
[Edit]
Über ein Select kann ich sicherlich die UUID anzeigen, möglicherweise gibt es eine Einstellung in IBExpert das der selbst erledgt.
Code:
select first 10 UUID_TO_CHAR(uuidpk), Name from testtbl
Gruß Kostas