新しいプロジェクトを開始しましたが、非常に正規化されたデータベースがあります。ルックアップできるものはすべて、ルックアップ テーブルへの外部キーとして格納されます。これは正規化されていて問題ありませんが、最も単純なクエリに対して 5 つのテーブル結合を行うことになります。
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}
いくつかのものを非正規化することをお勧めします。州コードのように。私が生きている間に州コードが変更されることはありません。3文字の代理店コードと同様の話。これらは代理店の代理店によって配布され、変更されることはありません。
状態コードの問題と 5 つのテーブル結合について DBA に連絡したとき。「正常化された」「結合が速い」という反応が返ってきました。
非正規化する説得力のある議論はありますか? 他に何もなければ、私は正気のためにそれをします。
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))