sfondo
Scrivo molti report di grandi dimensioni e in genere conservo un database di record sanitari di grandi dimensioni (scrivere SP, funzioni, lavori, ecc.). Lo schema originale e il software che lo utilizza provengono da un fornitore diverso, quindi non posso cambiare molto strutturalmente. Ci sono molti documenti che richiedono il monitoraggio come laboratori, procedure, vaccini, ecc. E sono sparsi su dozzine di tavoli, molti dei quali sono gonfiati e scarsamente indicizzati (sono stato in grado di risolvere un po ').
Il problema
Il problema è che, poiché abbiamo scarso controllo sul DB e poiché può cambiare da qualsiasi dato aggiornamento o patch, rende difficile e noiosa la scrittura e la gestione di questi report, soprattutto in presenza di grandi sovrapposizioni. Basta una sola patch e sono bloccato a riscrivere gran parte di una dozzina di rapporti. Inoltre, le query diventano rapidamente offuscate e lente man mano che i join, il nidificato vengono selezionati e applicati si accumulano.
La mia "soluzione"
Il mio piano era di scrivere tutti questi record in una tabella "catch-all" e scrivere trigger sulle tabelle originali per mantenere i record in questa tabella aggregata. Ovviamente avrei bisogno di assicurarmi che i miei trigger fossero intatti dopo gli aggiornamenti, ma questo sarebbe molto più facile dal punto di vista della manutenibilità e facendo semplicemente riferimento ai dati.
La tabella sarebbe sottile e lunga, memorizzando solo i dati richiesti, qualcosa del genere:
CREATE TABLE dbo.HCM_Event_Log (
id INT IDENTITY,
type_id INT NULL,
orig_id VARCHAR(36) NULL,
patient_id UNIQUEIDENTIFIER NOT NULL,
visit_id UNIQUEIDENTIFIER NULL,
lookup_id VARCHAR(50) NULL,
status VARCHAR(15) NULL,
ordered_datetime DATETIME NULL,
completed_datetime DATETIME NULL,
CONSTRAINT PK_HCM_Event_Log PRIMARY KEY CLUSTERED (id)
)
Quindi avrei varie tabelle relazionali per cose come type_id e raggruppamenti di elementi.
Sto iniziando a indovinare questa idea dato che molte di queste tabelle sono state scritte un po ', gli SP e i rapporti che scrivo farebbero riferimento anche ai dati. Quindi sono preoccupato che questa tabella diventi un incubo per il blocco dei record e delle prestazioni con così tanti I / O.
La mia domanda
È una cattiva o una buona idea? Mi rendo conto che ogni situazione è diversa in SQL Server (2008 r2 Standard Edition BTW) e nella regola "a volte", ma sto davvero cercando consigli generali.
Ho iniziato a considerare l'utilizzo di un broker di servizi, ma eseguivo solo semplici aggiornamenti / inserimenti ( vedi l'alternativa alla risposta accettata ). In molti casi i dati devono essere in tempo reale, quindi l'utilizzo di un DB di backup non funzionerebbe davvero. Le prestazioni sono già un po 'un problema per noi, ma la maggior parte è legata all'hardware che verrà risolta presto.