Was ist ein geeigneter globaler / universeller eindeutiger Bezeichner für eine PostGIS-Datenbank?


12

Ich habe gelesen, dass die Verwendung von OIDs als Primärschlüssel in einer PostgreSQL / PostGIS-Datenbank eine schlechte Praxis ist, da es Fälle gibt, in denen diese zurückgesetzt werden können. Klingt logisch, aber was ist dann eine geeignete Alternative? Ich glaube, es gibt eine Option zur Verwendung einer "Universal Unique Identifer" -UUID, aber der große Text- und Zahlenwert, der ausspuckt, ist schrecklich.

Nur ein bisschen mehr Hintergrund zu meiner Situation. Ich habe alle meine räumlichen Tabellen mit einem Feld namens "gid" erstellt, das der Primärschlüssel für diese Tabelle ist und nur für diese Tabelle eindeutig ist. Ich habe jetzt ein Problem, weil ich meine räumlichen Tabellen (alle mit einem "gid" -Feld, das bei 1 beginnt und inkrementiert) mit einer großen Tabelle mit den zugehörigen Informationen verknüpfen möchte. Damit meine Beziehung funktioniert, benötigen alle meine räumlichen Merkmale eine eindeutige Kennung, die sie voneinander unterscheidet.

BEARBEITET Dieses Bild wurde gemäß Peters Kommentar hinzugefügt. Peter, das ist die Idee, die ich in meinem Kopf habe. Es ist vielleicht nicht der beste Weg, das zu tun, oder es ist vielleicht nicht einmal ein gutes DB-Design. Ich interessiere mich für Ihre Meinung.

Konzeptionelles Diagramm

Irgendwelche Tipps?


2
"Ich habe gelesen" ... könnten Sie einen Link bereitstellen?
Kirk Kuykendall

1
Hier ist eine von vielen postgresql.org/docs/8.4/static/ddl-system-columns.html am Ende der Seite, auf der darauf hingewiesen wird , dass es keine gute Praxis ist, anzunehmen, dass sie einzigartig sind. Auch dieser nächste Link bytes.com/topic/postgresql/answers/423281-oid-not-oid eine Antwort auf den ursprünglichen Beitrag erwähnt, dass OIDs für Benutzertabellen veraltet sind.
Ando

1
Könnten Sie noch ein paar konkrete Details zu dem Schema hinzufügen, das Sie erstellen möchten? Mir ist nicht klar, dass Sie unbedingt eine global eindeutige ID benötigen, wenn Sie beispielsweise die Fremdschlüsselbeziehungen ein wenig ändern.
Peter Eisentraut

1
I believe there is an option to use a "Universal Unique Identifer" UUID, but the large text and number value that spits out is horrible. Warum ist es wichtig, wie die eindeutige ID aussieht?
Nmtoken

"... aber der große Text- und Zahlenwert, der ausspuckt, ist schrecklich." Nein, ist es nicht. Es ist nur lang, wie es für jede weltweit eindeutige ID-Nummer erforderlich ist .
jpmc26

Antworten:


5

Ich würde erstellen Sie separate Vermittler Tabellen buildings_attach, parcels_attachusw. Dann Sie keine globale Kennung benötigen.


Hallo Peter, Danke für die Antwort. Ich habe es endlich geschafft, mit unserem DBA in Kontakt zu treten (sie hat ihren Sitz in einem anderen Büro). Sie schlug die gleiche Lösung vor wie Sie. Ich bin froh, diesen Weg zu gehen, da ich definitiv keine DB-Person bin (könnte aus meiner Schemazeichnung ersichtlich sein?!?), Aber ist das wirklich die beste Lösung? Was passiert, wenn ein Anhang vorhanden ist, der sowohl für ein Paket-Feature als auch für ein Gebäude-Feature relevant ist? In meinem obigen Diagramm müsste ich die Details für den Anhang nur einmal eingeben. Als Lösung schlug der DBA vor, dass ich dies zweimal in zwei verschiedenen Tabellen tun müsste.
Ando

1
Ja, aber es handelt sich um zwei separate Informationen. Es ist also in Ordnung, sie an zwei separaten Stellen einzugeben. So funktioniert ein relationaler Datenbankentwurf.
Peter Eisentraut

Danke für die Hilfe Peter, ich schätze die Aufklärung! Ich werde diesen Weg gehen. Prost
Ando

9

Zwei Lösungen:

1) Erstellen Sie eine einzelne Sequenz und lassen Sie alle Tabellen diese Sequenz verwenden. Dies kann von Anfang an erfolgen, oder Sie erstellen eine ID-Spalte und aktualisieren Ihre Tabellen jetzt.

So erstellen Sie die Sequenz:

CREATE SEQUENCE universal_sequence;

Dann ein Tisch:

CREATE TABLE (
colname integer NOT NULL DEFAULT nextval('universal_sequence'));

So aktualisieren Sie ein vorhandenes Tabellen-ID-Feld mit neuen IDs:

UPDATE table1
SET id=nextval('universal_sequence'));

2) Die andere Lösung: Erstellen Sie eine temporäre Sequenz und führen Sie die Abfrage aus, wobei Sie eine neue ID-Spalte erstellen.

Mehr hier: http://www.postgresql.org/docs/8.4/static/sql-createsequence.html


4

Die beste Option ist die UUID oder GUID. Sie sind aus diesem Grund gebaut und weltweit einzigartig, egal an welchem ​​Tisch. Hässlich? Ja, aber sie sind die besten für diese Situation.

Siehe /programming/294933/generate-unique-id-to-share-with-multiple-tables-sql-2008

Ich habe Methoden gesehen, bei denen Leute Daten aus der Tabelle verwenden, um IDs zu erstellen, z. B. col1 + somestring + col2. Ich würde wirklich wirklich davon abraten (siehe hier ). Intelligente IDs sind eine wirklich schlechte Idee.


0

Hallo

Warum nimmst du nicht die ID vom großen Tisch und stellst sie stattdessen in die räumlichen Tabellen?

Wenn sich eine Zeile in einer der räumlichen Tabellen auf mehrere Zeilen in der großen Tabelle bezieht, wird das Problem angezeigt. Andernfalls sollte die ID der großen Tabelle ausreichen, oder fehlt mir etwas.

/ Nicklas


Hallo Nicklas, ich kann das nicht so machen, weil sich eines meiner räumlichen Merkmale auf einen oder mehrere Datensätze in der größeren Tabelle bezieht
Ando
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.