Qui in Brasile abbiamo un identificativo personale chiamato CPF . Questo identificatore ha una sequenza di 11 cifre ed è unico per ogni cittadino brasiliano. Forse in altri paesi c'è qualcosa di simile.
Come è un identificatore univoco, ho scelto di impostarlo nel database come UNICA CHIAVE . E ora che le cose si complicano. Un utente potrebbe essere registrato da un amministratore e rimosso da qualche tipo di problema. Tuttavia, non viene effettivamente rimosso, ma nascosto da una bandiera cancellata. E in un altro momento, potrebbe essere ricreato di nuovo (è necessario ricrearlo e non riattivarlo).
Poiché si tratta di un identificatore individuale, il CPF verrebbe riutilizzato su un utente ricreato e sarebbe in conflitto con UNIQUE KEY.
In questa situazione, ho pensato ad alcune soluzioni pratiche per risolvere il problema così come i suoi svantaggi. Ma mi piace qual è il modo più appropriato per risolvere questo tipo di problema.
- Non utilizzare un CHIAVE UNICO. Lo svantaggio è che potrebbe aumentare il tempo di interrogazione, che potrebbe essere risolto da una colonna solo KEY.
- Imposta la colonna su NULL su pseudo-DELETE. Lo svantaggio è che perdo le informazioni, tuttavia, potrei risolvere semplicemente creando una seconda colonna per memorizzare il suo valore prima di essere annullata.
- La UNIQUE KEY potrebbe raggruppare la colonna con una colonna di rimozione della data (NULL per impostazione predefinita). Lo svantaggio consiste nel dover utilizzare due colonne per ogni CHIAVE UNICO del gruppo.
- Crea una seconda tabella per archiviare i dati rimossi senza UNIQUE KEY. Gli svantaggi qui sono quasi incalcolabili!
- Rimuovi la riga, anziché nasconderlo. Lo svantaggio qui è che potrei perdere i riferimenti in un FK dell'utente.
Attualmente preferisco la prima opzione e, se necessario, opterei per la seconda o terza opzione. Ma mi chiedo se c'è un modo più corretto, seguendo il concetto più accettato dalla comunità.