报告的生成频率:每月几次、每天几次、每分钟几次?这些都不保证保留报告数据的持久副本。这种冗余数据不仅浪费空间,而且严重地使 DML 复杂化,以保持数据的准确性和最新性,并大大增加了错误潜入数据的可能性。
您可以拥有的是名为car_takeover_report 和car_fleet 的视图,它们提供如图所示的数据。这为报告生成器提供了所需格式的最新数据,而不会以冗余方式实际复制数据。
您还需要一个表格来包含每辆车的当前状态。 car_takeover_report 表似乎是最需要的,只需删除 mileage、car_owner 和 car_maker,因为它们可以与 car 表连接。
create table Company(
ID int auto_increment primary key,
Name varchar() not null,
Street varchar() not null,
City varchar() not null
);
create table Car(
ID int auto_increment primary key,
Mileage int not null,
OwnerID int not null references Company( ID ),
Make varchar() not null -- Really should be FK to mfgs table
);
create table CarStatus(
ID int not null primary key, -- one to one to Car table
EffDate date not null,
ReturnDate date,
Fuel int,
Workshop varchar() -- Really should be FK to Workshops table
);
create view CarTakeoverReport as
select s.EffDate as date_of_takeover, s.ReturnDate as date_of_return,
c.Mileage, c.OwnerID as owner, s.Fuel as quantity_of_gas,
c.Make as car_maker, s.Workshop
from Car c
left join CarStatus s
on s.ID = c.ID;
create view CarFleet as
select ...;