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))

Antworten auf die Frage(7)

Ihre Antwort auf die Frage