Rozpocząłem nowy projekt i mają one bardzo znormalizowaną bazę danych. wszystko, co może być odnośnikiem, jest przechowywane jako klucz obcy w tabeli odnośników. to jest znormalizowane i dobrze, ale kończę robić 5 połączeń tabeli dla najprostszych zapytań.Denormalizacja dla zdrowia psychicznego lub wydajności?
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}
Chciałbym polecić nam denormalizację niektórych rzeczy. jak kod państwa. Nie widzę zmian kodów stanu za mojego życia. podobna historia z 3-literowym kodem agencji. są one wydawane przez agencje agencji i nigdy się nie zmienią.
Kiedy zbliżyłem się do DBA z kwestią kodu stanu i 5 dołączeń do tabeli. otrzymuję odpowiedź, że "jesteśmy znormalizowani" i że "połączenia są szybkie".
Czy istnieje przekonujący argument do denormalizacji? Zrobiłbym to dla zdrowia, jeśli nic innego.
tej samej kwerendy w 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))
+1. Dobre pytanie. – David