Ho creato un'applicazione in Rails su Heroku utilizzando un database PostgreSQL.UUID come chiave primaria in PostgreSQL fornisce prestazioni di indice scadenti?
Ha un paio di tabelle progettate per essere in grado di sincronizzare con dispositivi mobili in cui i dati possono essere creati in luoghi diversi. Perciò ho un campo uuid che è una stringa che memorizza un GUID oltre a una chiave primaria di incremento automatico. L'uuid è quello che viene comunicato tra il server e i client.
Mi sono reso conto dopo l'implementazione del motore di sincronizzazione sul lato server che questo porta a problemi di prestazioni quando è necessario mappare tra uuid < -> id tutto il tempo (durante la scrittura di oggetti, ho bisogno di interrogare per l'uuid per ottenere l'id prima di salvare e il contrario quando si inviano i dati indietro).
Ora sto pensando di passare a utilizzare UUID come chiave primaria rendendo la scrittura e la lettura molto più semplice e veloce.
Ho letto che UUID come chiave primaria a volte può fornire prestazioni di indice scadenti (frammentazione dell'indice) quando si utilizza l'indice della chiave primaria in cluster. PostgreSQL soffre di questo problema o è corretto utilizzare UUID come chiave primaria?
Ho già una colonna UUID oggi, quindi, per quanto riguarda l'archiviazione, sarà meglio perché rilasciare la colonna ID normale.
Il campo 'id' utilizzato come chiave esterna da qualsiasi altra relazione nel database? Stai mantenendo questo campo 'id' perché ritieni che la PRIMARY KEY debba essere di tipo seriale per i motivi che hai descritto? –
Il clustering con chiave primaria sintetica è solo un vantaggio se si dispone di un percorso di accesso frequente che desidera interrogare un intervallo di questi valori di chiave, che è piuttosto raro nel mondo reale. UUID è un tipo perfettamente fine per chiave primaria, è abbastanza compatto (16 byte) e più veloce in confronto op rispetto al tipo di testo. – dbenhur
@Joshua I campi id vengono utilizzati come chiavi esterne, i campi UUID vengono utilizzati solo come campi regolari utilizzati per referenziare le relazioni durante la comunicazione (questa è la necessità di tradurli sempre tra loro) – thejaz