【问题标题】:Relational database design : duplicate attributes in tables for report关系数据库设计:报表中的重复属性
【发布时间】:2016-09-01 08:11:26
【问题描述】:

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

  • 车队(客户希望查看其汽车的当前状态:车间或运行、里程、汽车制造商......)

  • 接管报告(客户想看他的车交到车间时的详细信息:交货日期、车内油量、归还日期、车间名称、车主)。

图片描述了汽车接管报告和车队报告中必须显示的属性。

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

谁能告诉我我的数据库设计对于我的用例是否仍然可以接受?

【问题讨论】:

    标签: database-design


    【解决方案1】:

    报告的生成频率:每月几次、每天几次、每分钟几次?这些都不保证保留报告数据的持久副本。这种冗余数据不仅浪费空间,而且严重地使 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  ...;
    

    【讨论】:

    • 感谢您的好回答!非常感谢 !报告每天生成。我会坚持你的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多