Zum Inhalt

OID Generator

OID, TID, BID, t_ili_tid, tid... Sorry, wie bitte?

Oft erfordert die Modelldefinition einen systemübergreifend eindeutigen Identifikator. Die sogenannte OID.

[...]
  TOPIC Constructions =
    BASKET OID AS INTERLIS.UUIDOID;
    OID AS INTERLIS.STANDARDOID;
[...]

In der Datentransferdatei (xtf-Datei)...

... wird die OID des Baskets mit BID bezeichnet

... wird die OID der Objekte mit TID bezeichnet

<City_V1.Constructions BID="7dc3c035-b281-412f-9ba3-c69481054974">
  <City_V1.Constructions.Buildings TID="chMBAKER00000100"><Street>Rue des Fleures</Street><Number>1</Number></City_V1.Constructions.Buildings>
  <City_V1.Constructions.Buildings TID="chMBAKER00000101"><Street>Rue des Fleures</Street><Number>2</Number></City_V1.Constructions.Buildings>

Im physischen Schema...

... werden diese OIDs in die Spalte t_ili_tid geschrieben.

... während die Spalte t_id lediglich eine schemainterne Sequenz enthält, die für Fremdschlüssel usw. verwendet wird. Diese t_ids sind nicht der systemübergreifend eindeutige Identifikator.

oid physical data

Note

Es gibt Situationen, in denen du die t_id als TID in deinen Daten findest. Das ist der Fall, wenn keine t_ili_tid verfügbar ist, die ili2db verwenden könnte. Sei dir aber bewusst, dass diese TIDs dann keine stabilen OIDs sind.

OID-Domänen

Es gibt verschiedene Typen von OID-Domänen. In Model Baker versuchen wir, Standardwerte zu setzen, die in die Definition passen.

  • UUIDOID
  • I32OID
  • STANDARDOID
  • ANYOID
  • benutzerdefinierte OID

UUIDOID

Sie ist definiert als OID TEXT*36 und muss ein Universally Unique Identifier (UUID) sein. Die Wahrscheinlichkeit, dass eine UUID doppelt vorkommt, ist zwar nicht null, wird aber allgemein als nahe genug an null angesehen, um vernachlässigbar zu sein.

Im QGIS-Projekt lautet der Standardwert-Ausdruck für t_ili_tid daher folgendermassen:

uuid('WithoutBraces')

I32OID

Sie ist definiert als OID 0 .. 2147483647, was bedeutet, dass sie ein positiver 4-Byte-Integer-Wert sein muss.

Als Zähler nehmen wir denjenigen, der von der t_id-Sequenz bereitgestellt wird.

Im QGIS-Projekt lautet der Standardwert-Ausdruck für t_ili_tid daher folgendermassen:

t_id

STANDARDOID

Sie ist definiert als OID TEXT*16 und folgt einigen spezifischen Anforderungen.

Sie erfordert einen 8-Zeichen-Präfix und einen 8-Zeichen-Postfix:

  • Präfix (2 + 6 Zeichen): Länderkennung + ein globaler Identifikationsteil. Der globale Identifikationsteil kann bei der offiziellen Stelle bestellt werden.

  • Postfix (8 Zeichen): Sequenz (numerisch oder alphanumerisch) deines Systems als lokaler Identifikationsteil

Model Baker weiss nicht, was dein globaler Identifikationsteil ist, und verwendet einen Platzhalter-Präfix %change%. Es ist wichtig, dass du diesen Teil durch deinen eigenen Präfix ersetzt.

Als lokalen Identifikationsteil schlägt Model Baker den von der t_id-Sequenz bereitgestellten Zähler vor.

Im QGIS-Projekt lautet der Standardwert-Ausdruck für t_ili_tid daher folgendermassen:

'%change%' || lpad( T_Id, 8, 0 )

ANYOID

ANYOID definiert kein Format der OID, sondern nur, dass eine OID in allen erweiterten Modellen definiert werden muss. Diese Domäne wird nur bei Topics verwendet, die erweitert werden müssen. Diese Lösung hat einige Einschränkungen.

Benutzerdefinierte OIDs und nicht definierte OIDs

Für benutzerdefinierte OIDs oder wenn OIDs nicht definiert sind, versucht Model Baker, etwas Sinnvolles vorzuschlagen.

Wenn es keine Definition mit OID AS gibt, nimmt ili2db TEXT an, und daher müssen Identifikatoren die Regeln des XML-ID-Typs erfüllen. Das bedeutet, das erste Zeichen muss ein Buchstabe oder Unterstrich sein, gefolgt von Buchstaben, Zahlen, Punkten, Minuszeichen, Unterstrichen; keine Doppelpunkte (!), siehe www.w3.org/TR/REC-xml.

Im QGIS-Projekt lautet der Standardwert-Ausdruck für t_ili_tid daher:

'_' || uuid('WithoutBraces')

Zusammenfassung

OID-Domäne Vorgeschlagener Standardwert-Ausdruck
INTERLIS.UUIDOID uuid('WithoutBraces')
INTERLIS.I32OID t_id
INTERLIS.STANDARDOID '%change%' || lpad( t_id, 8, 0 )
INTERLIS.ANYOID '_' || uuid('WithoutBraces')
City_V1.TypeID '_' || uuid('WithoutBraces')
nicht definiert '_' || uuid('WithoutBraces')

OID Manager

Da die Benutzer:innen in der Lage sein müssen, diese Werte zu bearbeiten, werden sie im GUI bereitgestellt.

Zusätzlich zu der im Wizard implementierten Seite kann die Konfiguration der OIDs an bestehenden QGIS-Projekten vorgenommen werden.

Du findest den OID Manager über das Menü Datenbank > Model Baker.

tid manager

Hier kannst du den QGIS-Ausdrukseditor verwenden, um den Standardwert-Ausdruck für das Feld t_ili_tid jedes Layers zu bearbeiten.

Wenn du die t_ili_tid im Formular anzeigen möchtest, kannst du Anzeigen auswählen.

Wenn du einen Zähler in den Ausdrücken benötigst, kannst du das Feld t_id verwenden, das über eine schemaweite Sequenz hochzählt. Diese Sequenz kann von den Benutzer:innnen ebenfalls zurückgesetzt werden, aber sei vorsichtig, sie nicht niedriger einzustellen als bereits vorhandene t_ids in deinem Projekt. Siehe unten die Einschränkungen.

Einschränkungen

Diese Lösung deckt vieles ab, aber nicht alles.

ANYOID

Wenn eine Klasse Teil eines Topics mit einer OID-Definition von ANYOID ist und in mehreren anderen Topics mit anderen OID-Definitionen erweitert wird, können wir nicht sagen, was der Standardwert sein sollte, da er je nach Basket, in dem du arbeitest, abweichen könnte.

OIDs auf einem anderen System

Wenn die OIDs keine UUIDs sind, sondern z. B. STANDARDOIDs, ist es nicht möglich, in einem System zu wissen, ob in anderen Systemen dieselben OIDs generiert werden. Das bedeutet, es liegt in der Verantwortung der Benutzer:innen, die Ausdrücke (und die Zähler) so zu setzen, dass sie nicht mit OIDs von Objekten in Konflikt geraten, die anderswo generiert wurden.

T_Id-Konflikte

Beim Zurücksetzen des T_Id-Werts (Sequenz) muss man vorsichtig sein, da er auch für die technische Sequenz-ID (verwendet für Fremdschlüssel usw.) genutzt wird. Das bedeutet, er sollte nicht mit den t_ids bereits vorhandener Objekte in Konflikt geraten. Deshalb sollte er nur verringert werden, wenn du wirklich weisst, was du tust.

Die Konflikte werden je nach Datenbanksystem unterschiedlich behandelt. Bei PostgreSQL würdest du auf eine Duplicate-Key-Verletzung stossen, während bei GeoPackage die nächste verfügbare automatisch generierte t_id genommen würde, aber da sie beim Erstellen der OID nicht bekannt ist, würde sie diese Werte beschädigen (z. B. chMBakerAutogene statt z. B. chMBaker00000042 hineinschreiben.)