Denormalisierung für geistige Gesundheit oder Leistung?
Ich habe ein neues Projekt gestartet und sie haben eine sehr normalisierte Datenbank. Alles, was eine Suche sein kann, wird als Fremdschlüssel für die Nachschlagetabelle gespeichert. Das ist normalisiert und in Ordnung, aber am Ende mache ich 5 Tabellenverknüpfungen für die einfachsten Abfragen.
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}
Ich möchte empfehlen, dass wir einige Sachen denormieren. wie der Landescode. Ich sehe keine Änderung der Statuscodes in meinem Leben. ähnliche geschichte mit dem 3-buchstabigen agenturcode. Diese werden von der Agentur der Agenturen ausgehändigt und werden sich nie ändern.
Als ich mich an den DBA wandte, trat das Problem mit dem Statuscode und der 5-Tabellen-Verknüpfung auf. Ich bekomme die Antwort, dass "wir normalisiert sind" und dass "Joins sind schnell".
Gibt es ein zwingendes Argument für eine Denormalisierung? Ich würde es für die Vernunft tun, wenn sonst nichts.
die gleiche Abfrage in 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))