fundo
Escrevo muitos relatórios grandes para e geralmente mantenho um banco de dados grande de registros de saúde (escreva SPs, funções, trabalhos etc.). O esquema original e o software que o utiliza são de um fornecedor diferente, portanto não posso mudar muito estruturalmente. Existem muitos registros que exigem rastreamento, como laboratórios, procedimentos, vacinas etc., e estão espalhados por dezenas de tabelas, muitas das quais estão inchadas e mal indexadas (consegui corrigir isso de alguma forma).
O problema
O problema é que, como temos pouco controle sobre o banco de dados e, como ele pode mudar de qualquer atualização ou patch, torna difícil escrever e manter esses relatórios difíceis e entediantes - especialmente quando há muita sobreposição. Só é preciso um patch e estou preso reescrevendo grandes porções de uma dúzia de relatórios. Além disso, as consultas rapidamente ficam ofuscadas e lentas à medida que as junções, aninhados selecionam e se aplicam.
Minha "solução"
Meu plano era gravar todos esses registros em uma tabela "catch-all" e gravar gatilhos nas tabelas originais para manter os registros nessa tabela agregada. É claro que eu precisaria garantir que meus gatilhos estivessem intactos após as atualizações, mas isso seria muito mais fácil do ponto de vista de manutenção e apenas referenciando os dados.
A tabela seria fina e longa, armazenando apenas os dados necessários, algo como isto:
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)
)
Então, eu teria várias tabelas relacionais para coisas como o type_id e os agrupamentos de itens.
Estou começando a adivinhar essa idéia, já que várias dessas tabelas são gravadas um pouco, os SPs e os relatórios que eu estaria escrevendo também referenciam os dados. Por isso, estou preocupado que essa tabela se torne um pesadelo de bloqueio e desempenho de registros com tanta E / S.
Minha pergunta
É uma má ou uma boa ideia? Sei que todas as situações são diferentes no SQL Server (2008 r2 Standard Edition BTW) e a regra "às vezes", mas estou apenas procurando conselhos gerais.
Comecei a considerar o uso de um corretor de serviços, mas só estaria executando atualizações / inserções simples ( consulte a alternativa à resposta aceita ). Os dados em muitos casos precisam ser em tempo real, portanto, o uso de um banco de dados de backup não funcionaria realmente. O desempenho já é um problema para nós, mas a maior parte está relacionada ao hardware que será resolvida em breve.