我正在设计一个主要用于报告的关系数据库。有两份报告:
汽车车队(客户希望了解其汽车的现状:车间或跑步,里程,汽车制造商......)
接管报告(客户希望看到他的车被交给车间时的详细信息:交货日期,车内燃气量,退货日期,车间名称,车主。)
该图像描述了必须在汽车接管报告和车队报告中显示哪些属性。
我在考虑设计与生成的报告一样接近的车队和汽车接管表,但是我的表格中有很多属性是多余的。
有人可以告诉我我的数据库设计是否仍然适用于我的用例?
答案 0 :(得分:0)
报告的生成频率:一个月一次,一天几次,一次几次?这些都不能保留报告数据的持久副本。这种冗余数据不仅浪费空间,而且使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 ...;