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
risposta
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.
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
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). –
Un vincolo di chiave esterna richiede un indice 'UNICO' sulle colonne di destinazione. Non deve essere una chiave primaria. –
- 1. Memorizzazione della firma SHA1 come chiave primaria in Postgres SQL
- 2. Chiave primaria contro chiave
- 3. Attributo chiave primaria RestKit
- 4. Sospensione senza chiave primaria
- 5. SQLite aggiungi chiave primaria
- 6. Chiave primaria multicolumn MySQL
- 7. Chiave primaria basata annuale?
- 8. Nessun errore registrato con errore Postgres/Psycopg2 copy_from
- 9. GROUP BY chiave esterna o chiave primaria?
- 10. chiave esterna cakephp non la chiave primaria
- 11. Cambia chiave primaria a chiave composita (la chiave primaria esiste già)
- 12. Crea vista con chiave primaria?
- 13. SQLite: autoincremento domande chiave primaria
- 14. NHibernate - Nome Vincolo chiave primaria?
- 15. Elimina duplicati senza chiave primaria
- 16. Cassandra UPDATE chiave primaria valore
- 17. Chiave primaria composita in django
- 18. Modifica chiave primaria in alambicco?
- 19. Chiave primaria crescente vs decrescente
- 20. Sospensione, modifica identificatore/chiave primaria
- 21. Implementazione UUID come chiave primaria
- 22. Campo Chiave primaria Reset SQLite
- 23. Come ottengo la chiave primaria (s) di una tabella da Postgres via plpgsql?
- 24. Differenza tra chiave primaria, chiave univoca e chiave candidata
- 25. Chiave primaria composta, chiave esterna. Riferimento a oggetto o chiave?
- 26. Imposta la colonna come chiave primaria se la tabella non ha una chiave primaria
- 27. No identificatore/chiave primaria specificata per entità (...) le imprese devono avere e identificatore/chiave primaria
- 28. Hibernate chiave esterna con una parte della chiave primaria composita
- 29. PDO fetchAll() chiave primaria come chiave del gruppo di array
- 30. Modello Django Incremento automatico Chiave primaria basata su chiave esterna
Come gestiresti l'aggiornamento di un record in una tabella senza una chiave primaria? – Olaf
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
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