Ordinamento di righe su una chiave primaria autoincrementata

2

È una cattiva pratica affidarsi a una chiave primaria a incremento automatico per ordinare le righe in una tabella? Un collega e io stavamo discutendo di questo argomento. Dobbiamo essere in grado di trovare l'ultima riga inserita in una tabella e non abbiamo colonne di creazione / aggiornamento del tempo (che potrebbero essere considerate una cattiva pratica in sé, ma questo è un argomento diverso). Ovviamente non possiamo fare affidamento sull'ordine naturale delle righe, poiché ciò potrebbe essere incoerente. C'è qualcosa di intrinsecamente sbagliato nell'usare la chiave primaria in questo modo, dato che è un valore immutabile?

Avrei dovuto notare: la nostra implementazione sta usando Hibernate (un ORM) per recuperare i nostri oggetti. Non stiamo utilizzando alcuna query nativa, ma solo la funzionalità JPQL o Hibernate.

    
posta Apropos 28.02.2013 - 19:08
fonte

1 risposta

3

Se ti interessa il tempo, il tempo dovrebbe essere nel tuo database. Periodo. Vuoi vedere un caso in cui l'utilizzo di una sequenza potrebbe fallire (non sono sicuro che lo stesso potrebbe accadere con gli autoincrementi MySQL)?

Quando si richiede un valore da una sequenza all'interno di una transazione, non si tira semplicemente il valore successivo, il DB riserva per te un intero blocco di valori. Questo viene fatto per ridurre il sovraccarico di bloccare correttamente la sequenza e gestire più connessioni simultanee. Diamo un'occhiata a questa sequenza di eventi:

  • Il client n. 1 si collega al server
  • Il client # 1 richiede un valore da una sequenza
  • Il DB riserva 1-10 per il Cliente n. 1, assegna al Cliente n. 1 il valore 1
  • Il client # 1 inserisce 1 in una tabella
  • Il Cliente # 1 decide di fare qualcosa che richiederà del tempo
  • Il client n. 2 si collega al server
  • Il client # 2 richiede un valore da una sequenza
  • DB riserva 11-20 per il client n. 2, assegna al client n. 2 il valore 11
  • Il client n. 2 inserisce 11 in una tabella
  • Il client n. 2 commette e amp; disconnette
  • Il client n. 1 richiede il valore successivo dalla sequenza
  • DB dà al Cliente # 1 il valore 2
  • Il client n. 1 inserisce 2 in una tabella
  • Il cliente n. 1 si impegna e disconnette

Qual è lo stato del database adesso? Hai 1, 2 e amp; 11 nel tuo tavolo ma la riga con il 2 è la più recente. L'ordinamento per questo valore ti dà il risultato sbagliato.

    
risposta data 28.02.2013 - 20:51
fonte

Leggi altre domande sui tag