Eu encontrei o seguinte design de tabela para registrar referências de maneira não normalizada:
RecordGUID uniqueidentifier
DestinationEntity uniqueidentifier
DestinationRecordGUID uniqueidentifier
Por exemplo, para Users
tabela para descrever referências a Countries
, teremos:
RecordGUID DestinationEntity DestinationRecordGUID
79282C80-4474-4617-9C40-C21E97F5AC52 3A462EF8-DAB6-4B98-BA1B-FBD957A1737C 5842E524-8C5D-4DEE-A553-0857FB9C12F4
B25DA064-8DAF-4EEB-8894-D540B3A929EA 3A462EF8-DAB6-4B98-BA1B-FBD957A1737C C2B0AA1A-E688-4E2C-BD5F-16309C496774
Então, as 3A462EF8-DAB6-4B98-BA1B-FBD957A1737C
médias Countries
, while 5842E524-8C5D-4DEE-A553-0857FB9C12F4
e C2B0AA1A-E688-4E2C-BD5F-16309C496774
estão referenciando registros na Counries
tabela.
Estamos tendo muitas relações aqui - por exemplo, users
to languages
, companies
, etc. E porque trabalhar com GUID
para unir as tabelas não é amigável, temos uma visão indexada para cada relação assim:
CREATE VIEW [dbo].[users_countries]
WITH SCHEMABINDING
AS
SELECT [RecordGUID]
,[DestinationEntity]
,[DestinationRecordGUID]
FROM (the relationship table)
WHERE [DestinationEntity] = '3A462EF8-DAB6-4B98-BA1B-FBD957A1737C';
como resultado, pode-se facilmente fazer uma junção com esta visão à counties
tabela e consultá-la - também, por usar a visão (sem expansão) e ter um índice nela, nem todos os registros da tabela original são lidos (é mais rápido ).
O sistema pode ter centenas de visualizações indexadas e estou preocupado com o custo do mecanismo para gerenciá-las, comparado aos índices filtrados na tabela original. Quero dizer, em vez disso, ter view
apenas para criar um índice assim:
CREATE INDEX (index_Name) ON (the relationship table)
(
[RecordGUID]
,[DestinationRecordGUID]
)
WHERE [DestinationEntity] = '3A462EF8-DAB6-4B98-BA1B-FBD957A1737C'
Não podemos mais consultar de maneira amigável a tabela, mas isso afetará o desempenho?
Não consegui encontrar nenhum tópico sobre visualização indexada prejudicando o desempenho - mas enfrentar esse design me deixa em dúvida.
Gostaria de saber se podemos dizer que a manutenção do índice de uma view e do mesmo índice em uma tabela (como a acima) é a mesma?
Esse desenho é terrível. Você deve ter tabelas separadas e chaves estrangeiras reais. Para uma solução rápida, use as exibições indexadas. Se houver problemas de perf, corrija o design.