Desnormalizando a sanidade ou o desempenho?
Eu comecei um novo projeto e eles têm um banco de dados muito normalizado. tudo o que pode ser uma pesquisa é armazenado como a chave estrangeira para a tabela de pesquisa. isso é normalizado e bom, mas acabo fazendo 5 junções de tabelas para as consultas mais simples.
from va in VehicleActions
join vat in VehicleActionTypes on va.VehicleActionTypeId equals vat.VehicleActionTypeId
join ai in ActivityInvolvements on va.VehicleActionId equals ai.VehicleActionId
join a in Agencies on va.AgencyId equals a.AgencyId
join vd in VehicleDescriptions on ai.VehicleDescriptionId equals vd.VehicleDescriptionId
join s in States on vd.LicensePlateStateId equals s.StateId
where va.CreatedDate > DateTime.Now.AddHours(-DateTime.Now.Hour)
select new {va.VehicleActionId,a.AgencyCode,vat.Description,vat.Code,
vd.LicensePlateNumber,LPNState = s.Code,va.LatestDateTime,va.CreatedDate}
Eu gostaria de recomendar que denormativemos algumas coisas. como o código do estado. Eu não vejo os códigos de estado mudando na minha vida. história semelhante com o código de agência de 3 letras. estes são entregues pela agência de agências e nunca serão alterados.
Quando me aproximei do DBA com o problema de código de estado e as 5 junções de tabela. Eu recebo a resposta que "estamos normalizados" e que "junções são rápidas".
Existe um argumento convincente para desnormalizar? Eu faria isso por sanidade, se nada mais.
a mesma consulta no T-SQL:
SELECT VehicleAction.VehicleActionID
, Agency.AgencyCode AS ActionAgency
, VehicleActionType.Description
, VehicleDescription.LicensePlateNumber
, State.Code AS LPNState
, VehicleAction.LatestDateTime AS ActionLatestDateTime
, VehicleAction.CreatedDate
FROM VehicleAction INNER JOIN
VehicleActionType ON VehicleAction.VehicleActionTypeId = VehicleActionType.VehicleActionTypeId INNER JOIN
ActivityInvolvement ON VehicleAction.VehicleActionId = ActivityInvolvement.VehicleActionId INNER JOIN
Agency ON VehicleAction.AgencyId = Agency.AgencyId INNER JOIN
VehicleDescription ON ActivityInvolvement.VehicleDescriptionId = VehicleDescription.VehicleDescriptionId INNER JOIN
State ON VehicleDescription.LicensePlateStateId = State.StateId
Where VehicleAction.CreatedDate >= floor(cast(getdate() as float))