关系数据库设计:报表中表的重复属性

时间:2016-08-30 16:38:23

标签: database-design

我正在设计一个主要用于报告的关系数据库。有两份报告:

  • 汽车车队(客户希望了解其汽车的现状:车间或跑步,里程,汽车制造商......)

  • 接管报告(客户希望看到他的车被交给车间时的详细信息:交货日期,车内燃气量,退货日期,车间名称,车主。)

该图像描述了必须在汽车接管报告和车队报告中显示哪些属性。

我在考虑设计与生成的报告一样接近的车队和汽车接管表,但是我的表格中有很多属性是多余的。

有人可以告诉我我的数据库设计是否仍然适用于我的用例?

enter image description here

1 个答案:

答案 0 :(得分:0)

报告的生成频率:一个月一次,一天几次,一次几次?这些都不能保留报告数据的持久副本。这种冗余数据不仅浪费空间,而且使DML严重复杂化,使数据保持准确和最新,并大大增加了错误传播到数据的可能性。

可以拥有的是名为car_takeover_reportcar_fleet的视图,这些视图提供了图中所示的数据。这为报告生成器提供了所需格式所需的最新数据,而无需以冗余方式实际复制数据。

您还需要一个表格来包含每辆车的当前状态。表car_takeover_report似乎是所需内容的大部分内容,只需删除mileagecar_ownercar_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  ...;