Che cos'è un identificatore univoco globale / universale adatto per un database PostGIS?


12

Ho letto che usare OID come chiave primaria in un db postgreSQL / PostGIS è una pratica inadeguata perché ci sono casi in cui questi possono essere ripristinati. Sembra logico, ma allora qual è un'alternativa adatta? Credo che ci sia un'opzione per usare un UUID "Universal Unique Identifer", ma l'ampio valore di testo e numero che sputa è orribile.

Solo un po 'più di sfondo alla mia situazione. Ho creato tutte le mie tabelle spaziali con un campo chiamato "gid" che è la chiave primaria per quella tabella e unica solo per quella tabella. Ora ho un problema perché voglio mettere in relazione le mie tabelle spaziali (tutte con un campo "gid" che inizia da 1 e incrementa) con una tabella di grandi dimensioni con le informazioni correlate. Ovviamente perché la mia relazione funzioni tutte le mie caratteristiche spaziali hanno bisogno di un identificatore univoco che le differenzi le une dalle altre.

EDITED Aggiunta questa immagine come da commento di Peters. Peter questa è l'idea che ho in testa, potrebbe non essere il modo migliore per farlo o potrebbe non essere nemmeno un buon design db. Sono interessato a quello che pensi.

Diagramma concettuale

Qualche consiglio?


2
"Ho letto" ... potresti fornire un link?
Kirk Kuykendall,

1
Ecco uno dei tanti postgresql.org/docs/8.4/static/ddl-system-columns.html verso il fondo della pagina che menziona che è una cattiva pratica presumere che siano unici. Anche questo prossimo link bytes.com/topic/postgresql/answers/423281-oid-not-oid una risposta al post originale menziona che gli OID sono deprecati per le tabelle degli utenti.
Ando,

1
Potresti aggiungere alcuni dettagli più concreti sul tipo di schema che stai cercando di creare. Non è chiaro per me che hai necessariamente bisogno di un ID univoco a livello globale se cambi un po 'le relazioni di chiave esterna, per esempio.
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. Perché è importante l'aspetto dell'ID univoco?
nmtoken,

"... ma il grande valore del testo e del numero che sputa è orribile." No non lo è. È solo lungo, come richiesto da qualsiasi numero ID univoco a livello globale .
jpmc26,

Risposte:


5

Vorrei creare tabelle intermedie separati buildings_attach, parcels_attach, ecc Poi non è necessario un identificatore globale.


Ciao Peter, grazie per la risposta. Finalmente sono riuscito a mettermi in contatto con il nostro DBA (che ha sede in un altro ufficio), mi ha suggerito la stessa soluzione. Sono felice di seguire questa strada poiché non sono assolutamente una persona DB (potrebbe essere ovvio dal mio disegno di schema?!?), Ma è davvero la soluzione migliore? Cosa succede se esisteva un allegato rilevante sia per una funzione Pacchi che per una funzione di costruzione? Nel mio diagramma sopra avrei solo bisogno di inserire i dettagli per l'allegato una volta, dove come soluzione suggeriva il DBA avrei dovuto farlo due volte in due diverse tabelle.
Ando,

1
Sì, ma sono due informazioni separate, quindi è OK inserirle in due luoghi separati. È solo il modo in cui funziona la progettazione di un database relazionale.
Peter Eisentraut,

Grazie per l'aiuto Peter, apprezzo il chiarimento! Seguirò quella strada. Saluti
Ando,

9

Due soluzioni:

1) Crea una singola sequenza e fai in modo che tutte le tabelle utilizzino quella sequenza, può essere eseguita dall'inizio oppure puoi creare una colonna ID e aggiornare le tue tabelle ora.

Per creare la sequenza:

CREATE SEQUENCE universal_sequence;

Quindi una tabella:

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

Per aggiornare un campo ID tabella esistente con nuovi ID (farlo per tutte le tabelle che si desidera seguire la stessa sequenza):

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

2) L'altra soluzione: creare una sequenza temporanea ed eseguire la query creando una nuova colonna ID.

Altro qui: http://www.postgresql.org/docs/8.4/static/sql-createsequence.html


4

L'opzione migliore è l'UUID o GUID. Sono costruiti per questo motivo, unici a livello globale, indipendentemente dalla tabella. Brutto? Sì, ma sono i migliori per questa situazione.

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

Ho visto metodi in cui le persone usano i dati della tabella per creare ID, ad es. Col1 + somestring + col2, mi sarei davvero opposto a questo (vedi qui ). Gli ID intelligenti sono una pessima idea.


0

ciao

Perché non prendi l'id dal tavolo grande e metti invece i tavoli spaziali?

Se una riga in una delle tabelle spaziali si riferisce a più righe nella tabella grande vedo il problema, altrimenti l'id della tabella grande dovrebbe essere sufficiente o mi manca qualcosa.

/ Nicklas


Ciao Nicklas, non posso farlo in questo modo perché una delle mie caratteristiche spaziali potrebbe riguardare 1 o più record nella tabella più grande
Ando,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.