Condividerò con te il mio design ed è diverso da entrambi i tuoi progetti in quanto richiede una tabella per ogni tipo di entità. Ho trovato il modo migliore per descrivere qualsiasi progetto di database è tramite ERD, ecco il mio:
In questo esempio abbiamo un'entità denominata dipendente . user table contiene i record dei tuoi utenti e entity e entity_revision sono due tabelle che contengono la cronologia delle revisioni per tutti i tipi di entità che avrai nel tuo sistema. Ecco come funziona questo design:
I due campi di entity_id e revision_id
Ogni entità nel tuo sistema avrà un ID entità unico a sé stante. La tua entità potrebbe passare attraverso le revisioni ma il suo entity_id rimarrà lo stesso. È necessario mantenere questo ID entità nella tabella dei dipendenti (come chiave esterna). Dovresti anche memorizzare il tipo di entità nella tabella delle entità (ad es. "Impiegato"). Ora, come per revision_id, come mostra il suo nome, tiene traccia delle revisioni della tua entità. Il modo migliore che ho trovato per questo è usare il dipendente_id come revisione_id. Ciò significa che avrai duplicati ID di revisione per diversi tipi di entità, ma questo non è un piacere per me (non sono sicuro del tuo caso). L'unica nota importante da prendere è che la combinazione di entity_id e revision_id dovrebbe essere unica.
C'è anche un campo di stato nella tabella entity_revision che indica lo stato di revisione. Può avere uno dei tre stati: latest
, obsolete
o deleted
(non contando sulla data di revisione si aiuta molto per aumentare le vostre domande).
Un'ultima nota su revision_id, non ho creato una chiave esterna che collega employee_id a revision_id perché non vogliamo modificare la tabella entity_revision per ogni tipo di entità che potremmo aggiungere in futuro.
INSERIMENTO
Per ogni dipendente che si desidera inserire nel database, si aggiungerà anche un record a entity e entity_revision . Questi ultimi due record ti aiuteranno a tenere traccia di chi e quando un record è stato inserito nel database.
AGGIORNARE
Ogni aggiornamento per un record di dipendente esistente verrà implementato come due inserti, uno nella tabella dei dipendenti e uno in entity_revision. Il secondo ti aiuterà a sapere da chi e quando il record è stato aggiornato.
CANCELLAZIONE
Per eliminare un dipendente, viene inserito un record in entity_revision che indica la cancellazione e fatto.
Come puoi vedere in questo progetto, nessun dato viene mai modificato o rimosso dal database e, soprattutto, ogni tipo di entità richiede solo una tabella. Personalmente trovo questo design davvero flessibile e facile da lavorare. Ma non sono sicuro di te in quanto le tue esigenze potrebbero essere diverse.
[AGGIORNARE]
Avendo supportato le partizioni nelle nuove versioni di MySQL, credo che il mio design abbia anche una delle migliori prestazioni. Si può partizionare la entity
tabella usando il type
campo mentre la partizione entity_revision
usa il suo state
campo. Ciò aumenterà SELECT
di gran lunga le domande mantenendo il design semplice e pulito.