2012-10-01 27 views
14

C'è qualche svantaggio nel non avere una chiave primaria per una tabella in Postgres? Poiché tutti i dati sono archiviati in ordine sparso nell'heap, la chiave primaria è solo un modo per applicare contemporaneamente una chiave univoca e un indice? O c'è una caratteristica fondamentale che una chiave primaria fornisce in una tabella rispetto a una tabella che non ha una chiave primaria?Postgres Nessun svantaggio chiave primaria

+1

Come gestiresti l'aggiornamento di un record in una tabella senza una chiave primaria? – Olaf

+0

Non è necessario recuperare righe singole e le righe non vengono mai aggiornate, solo inserite. Sebbene le righe abbiano identità individuali (UUID), vengono sempre catturate solo in intervalli. Ho indici sugli intervalli, ma non ha senso avere un indice sulla chiave univoca se può essere evitato. – AlexGad

+1

Sto ponendo la domanda specifica, perché provengo da uno sfondo di SQL Server e decidere se avere un indice cluster su una tabella o una tabella solo heap è una decisione importante da prendere. Con Postgres, questa decisione sembra priva di significato dal momento che i dati vengono sempre archiviati senza ordine nella tabella per cominciare. Tuttavia, voglio assicurarmi di essere corretto in questa ipotesi. Qual è il vantaggio di un PK in Postgres vs, ad esempio un vincolo univoco e un indice separato? C'è qualche distinzione o è solo un modo stenografico per fornire quelle caratteristiche? – AlexGad

risposta

15

Per la documentazione Postgres (http://www.postgresql.org/docs/9.2/static/sql-createtable.html):

Tecnicamente, chiave primaria è semplicemente una combinazione di unico e non NULL, ma l'identificazione di un set di colonne come chiave primaria fornisce anche i metadati relativi alla progettazione dello schema, poiché una chiave primaria implica che le altre tabelle possono contare su questo insieme di colonne come identificatore univoco per le righe.

Per esperienza, ho creato molti tavoli senza di loro. Uno dei maggiori inconvenienti di non avere una chiave primaria è che non si possono avere controlli di integrità referenziale tramite chiave esterna - dal momento che tale relazione ne richiede uno. Penso che alcune soluzioni di replica richiedano anche una chiave primaria o l'identificatore a colonna singola per riga.

+0

Ah, buon punto sul problema della replica. Mi è completamente sfuggito di mente. Sebbene disponga di un UUID univoco in ogni riga, dovrei assicurarmi che nessun PK non sia un problema di replica (nessuna chiave esterna per questo, quindi non è un problema). Grazie. – AlexGad

+1

Un altro problema che viene in mente è che la maggior parte degli ORM (ad es. Django) ha problemi a trattare con tabelle che non hanno chiavi primarie. Quindi, se mai hai bisogno di mettere un'interfaccia utente in cima al tavolo, allora potrebbe rendere la vita un po 'più dura su chi ci sta lavorando. Non è un grosso problema, ma potrebbe essere una considerazione (a seconda dei dati e di ciò che sta accadendo all'interno della vostra azienda/squadra). –

+8

Un vincolo di chiave esterna richiede un indice 'UNICO' sulle colonne di destinazione. Non deve essere una chiave primaria. –

Problemi correlati