Imposta data modificata = data di creazione o null alla creazione del record?

4

Ho seguito la convenzione di aggiungere colonne create e modificate alla maggior parte delle mie tabelle di database. Ho anche lasciato la colonna modificata come nulla alla creazione del record e solo impostando un valore sulla modifica effettiva.

L'altra alternativa è impostare la data modificata in modo che corrisponda alla data di creazione sulla creazione del record.

L'ho fatto nel modo precedente, ma di recente mi sono imbattuto in una sola truffa che mi fa seriamente pensare al passaggio. Avevo bisogno di impostare una dipendenza della cache del database per scoprire se qualche dato esistente è stato modificato o se sono stati aggiunti nuovi dati. Invece di essere in grado di fare quanto segue:

SELECT MAX(modified) FROM customer

Devo fare questo:

SELECT GREATEST(MAX(created), MAX(modified)) FROM customer

L'aspetto negativo è che è una query più complessa e più lenta. Un'altra cosa è nei file system, credo che usino solitamente la seconda convenzione per l'impostazione di data di modifica = data di creazione alla creazione.

Quali sono i pro e i contro dei diversi metodi? Cioè, quali sono i problemi da considerare?

Aggiorna

Credo che visti gli apparenti compromessi che ho intenzione di fare con la strategia modificata = creata. Inoltre, ero curioso di sapere come altri database web lo gestissero e ho notato che drupal sembra seguire la convenzione di modified = created anche.

    
posta User 07.11.2012 - 17:41
fonte

3 risposte

7

Con modified = created se vuoi che le ultime modifiche con quelle mai modificate siano incluse puoi contare sulla colonna modificata. Tuttavia, se la colonna modificata è inizializzata con null, devi eseguire un COALESCE(modified, created) che peggiori.

Con modified = created se vuoi che le modifiche con quelle non modificate siano escluse semplicemente where modified != created , e con null inizializzato modificato devi fare un where modified IS NOT NULL che avrebbe una performance abbastanza simile, anche se leggermente migliore e aumentando le prestazioni con più record con una colonna modificata null.

Queste sono davvero le uniche differenze, entrambe offrono le stesse capacità di filtrare e aggregare i dati, devi solo usare tecniche leggermente diverse per ciascuna. Preferisco inizializzare modified = created per evitare le coales. Sebbene l'inizializzazione con valori null possa dipendere dal tuo sistema di database, salva spazio su disco, specialmente se le modifiche sono rare al punto che avrai principalmente nulli. Inoltre, se hai principalmente nulli, le prestazioni di where modified IS NOT NULL saranno un po 'migliori rispetto a where modified != created a causa del set più piccolo che soddisfa la condizione.

Modifica: Inoltre, se sei interessato a dati basati su modifiche abbastanza frequentemente da mettere un indice su questa colonna (scenario piuttosto insolito ma non conosco il tuo caso d'uso), l'indice dove modified = created avrebbe caratteristiche di performance diverse dall'inizializzazione con null, e qualsiasi coalescenza con un valore significativo di null perde qualsiasi beneficio dall'indice perché la coalescenza spingerà la query fuori dall'indice.

    
risposta data 07.11.2012 - 17:52
fonte
2

Penso che li abbia già riassunti.

Il grande pro per avere inizialmente l'ultima data modificata uguale alla data di creazione è che il tuo codice è molto più semplice. Il codice più semplice è buono in quanto è più facile da mantenere.

L'unico problema che posso pensare ora è che se è necessario verificare se il record è stato modificato, il codice dovrà confrontare due date piuttosto che controllare se la data di modifica è nullo. Non proprio un grosso svantaggio.

    
risposta data 07.11.2012 - 17:51
fonte
1

A seconda di cosa si usano le date, un'altra strategia da considerare è l'aggiunta di numeri di versione. Quindi puoi mantenere le versioni precedenti in giro per il controllo e questo può aiutare a risolvere i conflitti quando due client leggono i dati contemporaneamente e quindi entrambi inviano le modifiche (anche se puoi arrivare anche con le date di modifica)

    
risposta data 07.11.2012 - 23:10
fonte

Leggi altre domande sui tag