Domanda

Sto cercando di identificare il modo migliore per progettare un tavolo per scopi di audit. Fondamentalmente registro diversi eventi per molti utenti in una tabella. C'è un limite al numero di record per ciascun utente. I nuovi record arrivano, il più vecchio va.

Qualcosa come questo:

CREATE TABLE Audit
(
  UserId INT NOT NULL,
  EventId INT NOT NULL,
  CreationDate DATETIME NOT NULL,
  UpdateDate DATETIME NULL,
  -- Other data fields
)

La domanda è cosa fare con gli indici. Sto pensando di creare l'indice cluster su (UserId, EventId). Ma poiché l'attività dell'utente si verifica in modo indipendente, significherebbe inserti nel mezzo del tavolo e si cancella al centro del tavolo. Probabilmente non va bene.

Un altro pensiero è quello di aggiungere un artificiale AuditId campo solo per avere nuovi record ottengono numeri crescenti. Come questo:

CREATE TABLE Audit
(
  Id INT, -- Becomes the clustered index
  -- The same as above
)

In questo modo le nuove voci di audit saranno aggiunte alla fine, ma le eliminate avverranno comunque nel mezzo del tavolo. Probabilmente è meglio della prima opzione ma non ne sono sicuro.

Questa tabella verrà utilizzata frequentemente, fondamentalmente ogni attività dell'utente verrà registrata (1 inserto) e l'attività più antica viene eliminata nella stessa transazione (1 eliminazione). Questo deve essere veloce. Bene, voglio che sia istantaneo idealmente e non evidente in termini di prestazioni.

Devo anche essere in grado di recuperare rapidamente il set di record per un determinato utente. Può probabilmente essere coperto da un indice non cluster.

Sto chiedendo consigli nella progettazione di questo tavolo per prestazioni ottimali.

EDIT: Penso di aver perso qualcosa di importante da menzionare.

Quello che sto cercando di tracciare non è istantaneo nel tempo ma piuttosto un periodo nel tempo. Ci sono diversi posti nel sistema in cui ne ho bisogno. Considera ciò che l'utente sta facendo un'attività di qualche tipo che può estendersi. Se sono soddisfatte determinate condizioni, viene riutilizzata un'attività esistente (aggiornata, aggiornata). Desidero solo eliminare le vecchie attività abbandonate. Ad esempio, entro 2 settimane un utente potrebbe aver emesso come 50 attività, ma per un altro utente da produrre di quanto molti potrebbero richiedere più di un anno. Ecco perché non voglio un registro generalmente ordinato per tutti gli utenti insieme.

Inoltre, non è chiaro come dovrei raggrupparsi per DateTime (come suggerito). Lo faccio durante l'evento di creazione iniziale o sull'evento di aggiornamento?

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top